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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VeNick
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
#1

free - C++

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

Выделил память под массив(строку), размером 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 в delete - C++
Как эту функцию можно переписать с помощью delete? void A(int **p,int r){ int **pr; for(pr = p; pr &lt; pr + r; tr++) ...

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1449 / 1178 / 62
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
04.11.2013, 12:23     free #4
Цитата Сообщение от VeNick Посмотреть сообщение
Но если данные в этой области памяти не имеют смысла, потому что в указателе лежит уже другой адрес, почему бы не освободить там память?
Потому, что realloc эту память уже освободил.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 12:30     free
Еще ссылки по теме:

Работа с calloc и free в C++ - C++
Всем добрый день!! Уважаемые программисты посмотрите пожалуйста, корректно ли я использую эти функции для динамического выделения памяти,...

Free - не удаляется память - C++
free(Items.info);//для последнего элемента память не уудаляется - костыль!!!!!!!!!!!!!!! делал лабу на СИ, пришлось соответственно...

lock-free vector - C++
Собственно вопрос, есть ли реализации lock free вектора?

SIGABRT после free malloc - C++
не могу почистить string array matches (2 dim) проблема возникает на линии 114 отмеченной как //Cleaning up an array не могу почистить...

Освобождение памяти malloc free - C++
В общем работаю над расширением для php (для тренировки в php и в c++ сразу) Суть дела вот в чем, наткнулся на конвертер php массива в...

Использование calloc/realloc/free - C++
//calloc.cpp //Использование calloc #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;locale&gt; using...


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

Или воспользуйтесь поиском по форуму:
VeNick
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 5
04.11.2013, 12:30  [ТС]     free #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому, что realloc эту память уже освободил.
Понятно, спасибо.
Yandex
Объявления
04.11.2013, 12:30     free
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru