Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
1

free

04.11.2013, 11:55. Показов 994. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Выделил память под массив(строку), размером 5 элементов.
C++
1
2
3
4
5
6
7
    char *str;
    str = (char*)calloc(5,sizeof(char));
    if (str == NULL)
    {
        cout<<"ERROR"<<endl;
        exit(1);
    }
По мере ввода строки, выделяется дополнительная память.
realloc может возвратить указатель на новую область памяти, поэтому старую нужно очистить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    int i;
    char simvol;
    char *strold;
    for (i = 0; (simvol = getchar()) != '\n'; i++)
    {
        if (i%5 == 0  && i != 0)
            {
                strold = str;
                str = (char*)realloc(str, (i+5)*sizeof(char));
                if (str == NULL)
                {
                    cout<<"ERROR"<<endl;
                    exit(1);        
                }
                if(strold != str)
                    free(strold);
            }
        str[i] = simvol;
    }
С помощью отладочных печатей, обнаружил, что ошибка возникает в строчке
C++
1
free(strold);
Что-то там про кучу...
Помогите разобраться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 11:55
Ответы с готовыми решениями:

ошибка с free
#define _CRTDBG_MAP_ALLOC #include &lt;stdlib.h&gt; #include &lt;crtdbg.h&gt; #include &lt;iostream&gt; #include...

free и метки
Здравствуйте, господа. Никак не могу найти ответы на след. вопросы: 1). Для того, чтобы...

Компилятор C-Free
Начинаю изучать язык программирования C++. Какой вы можете дать отзыв о вышеупомянутом компиляторе?...

C-Free Standart
Для формулы: Y=1.7*x+7.8*sin(2.1*x)+3.4*(х-1)-7.2 , A=-3,B=3,H=0.1. Составить программу построения...

5
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
04.11.2013, 12:05 2
realloc может возвратить указатель на новую область памяти, поэтому старую нужно очистить.
Не нужно очищать в этом случае; нужно освобождать память только после того, как она уже не нужна.
1
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 12:15  [ТС] 3
Цитата Сообщение от gray_fox Посмотреть сообщение
Не нужно очищать в этом случае; нужно освобождать память только после того, как она уже не нужна.
Но если данные в этой области памяти не имеют смысла, потому что в указателе лежит уже другой адрес, почему бы не освободить там память? Видимо, я просто чего-то элементарного не понимаю.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
04.11.2013, 12:23 4
Цитата Сообщение от VeNick Посмотреть сообщение
Но если данные в этой области памяти не имеют смысла, потому что в указателе лежит уже другой адрес, почему бы не освободить там память?
Потому, что realloc эту память уже освободил.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.11.2013, 12:29 5
Цитата Сообщение от VeNick Посмотреть сообщение
realloc может возвратить указатель на новую область памяти, поэтому старую нужно очистить.
Вторая часть предложения ошибочна.
If the new size of the memory object would require movement of the object, the space for the previous instantiation of the object is freed.
1
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 12:30  [ТС] 6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому, что realloc эту память уже освободил.
Понятно, спасибо.
0
04.11.2013, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2013, 12:30
Помогаю со студенческими работами здесь

calloc, free.
как правильно выделить память для двумерного массива а, при m=5,n=10 используя функцию calloc. и...

с free в delete
Как эту функцию можно переписать с помощью delete? void A(int **p,int r){ int **pr; ...

Free - не удаляется память
free(Items.info);//для последнего элемента память не уудаляется - костыль!!!!!!!!!!!!!!! делал...

Free(): invalid pointer
Здравствуйте. Пишу простой менеджер контактов (универ. лаба). Использую string и структуры. У...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru