Форум программистов, компьютерный форум CyberForum.ru

free - C++

Восстановить пароль Регистрация
 
VeNick
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 11:55     free #1
Выделил память под массив(строку), размером 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);
Что-то там про кучу...
Помогите разобраться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 11:55     free
Посмотрите здесь:

free и метки C++
calloc, free. C++
ошибка с free C++
Работа с calloc и free в C++ C++
с free в delete C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.11.2013, 12:05     free #2
realloc может возвратить указатель на новую область памяти, поэтому старую нужно очистить.
Не нужно очищать в этом случае; нужно освобождать память только после того, как она уже не нужна.
VeNick
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 12:15  [ТС]     free #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Не нужно очищать в этом случае; нужно освобождать память только после того, как она уже не нужна.
Но если данные в этой области памяти не имеют смысла, потому что в указателе лежит уже другой адрес, почему бы не освободить там память? Видимо, я просто чего-то элементарного не понимаю.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.11.2013, 12:23     free #4
Цитата Сообщение от VeNick Посмотреть сообщение
Но если данные в этой области памяти не имеют смысла, потому что в указателе лежит уже другой адрес, почему бы не освободить там память?
Потому, что realloc эту память уже освободил.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.11.2013, 12:29     free #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.
VeNick
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 12:30  [ТС]     free #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому, что realloc эту память уже освободил.
Понятно, спасибо.
Yandex
Объявления
04.11.2013, 12:30     free
Ответ Создать тему
Опции темы

Текущее время: 17:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru