Понимание концепции свободного - PullRequest
5 голосов
/ 21 марта 2011

Попробовал следующий код:

#include<stdio.h>
int main()
{        
        int *p,*q;
        p = (int *)malloc(sizeof(int));
        *p =10;
        q = p;
        printf("%u \n",p);
        printf("%u \n",q);
        free(p);
        printf("%u \n",p);
        return 0;
}

Полученный результат выглядит следующим образом:

[root@lnxdesk Tazim]# ./a.out
154804232
154804232
154804232

Почему этот адрес внутри p все еще печатается, даже если я сделал free(p);?Что же тогда сделал * 1008?

Я хочу четко понять концепцию free / malloc.Любая помощь будет ценной.

Ответы [ 6 ]

5 голосов
/ 21 марта 2011

free() только освобождает память в куче. Это не меняет значение вашего указателя. Если вы попытаетесь распечатать память, указанную указателем, вы , вероятно, получите какую-то фигню.

Кроме того, когда вы вызывали free, вы указали ему указатель, а не адрес вашего указателя, поэтому free не может изменить ваш указатель ...

3 голосов
/ 21 марта 2011

Это неопределенное поведение - как только вы free d указатель, сохраненный адрес становится недействительным, и вы ничего не можете с ним сделать - не только вы не можете разыменовать его, но вы можете даже printf() значение указателя.

2 голосов
/ 21 марта 2011

Вы печатаете указатели, то есть адреса зон памяти, выделенных для вас в целых.Освобождение зоны памяти с помощью free не устанавливает адрес указателя на 0x00, как я думаю, вы ожидаете.

Он просто сообщает ОС, что зона памяти снова доступна для повторного использования в будущем.

Если вы печатаете *p после free(p), у вас будут проблемы.

1 голос
/ 21 марта 2011

malloc() и его резервное пространство в области памяти, называемой «кучей», и возвращает указатель на эту зарезервированную область.Таким образом, в приведенном выше примере p указан указатель на, вероятно, четырехбайтовую область памяти, которая была зарезервирована для ее использования (адрес которой на этот раз 154804232).Когда вы делаете *p = 10, вы помещаете целое значение 10 в указанную память.Когда вы делаете q = p, вы теперь заставляете q указывать на тот же кусок зарезервированной памяти кучи.

free() и его значение просто unreserve память.Когда вы звоните free(), вы говорите: «Я больше не буду использовать эту память».Все, что free() делает, это сообщает системе управления памятью, что блок памяти снова доступен для использования. Он решительно не меняет ваш указатель. Он просто сигнализирует о наличии блока памяти.После этого вам остается убедиться, что вы не используете этот указатель снова.

Если вы снова используете этот указатель, он может работать нормально.Однажды.Или дважды.Или тысячу раз.В принципе, он будет работать нормально, пока вы не будете использовать его после того, как кто-то еще скажет, что указанный вами блок памяти свободен и что-то с ним сделает.Когда это произойдет, случается плохое .Пожалуйста, не делай плохих вещей.

0 голосов
/ 21 марта 2011

free не переназначает указатель для указания на что-то еще.На самом деле, в стандарте C ничего не говорится о том, что нужно делать с указателем.Это все, что сказано в описании:

Свободная функция вызывает освобождение пространства, на которое указывает ptr, то есть делает его доступным для дальнейшего выделения.Если ptr является нулевым указателем, никаких действий не происходит.В противном случае, если аргумент не совпадает с указателем, ранее возвращенным функцией calloc, malloc или realloc, или если пространство было освобождено при вызове free или realloc, поведение не определено

0 голосов
/ 21 марта 2011

Помните: указатель - это не что иное, как адрес. До, после вашего malloc или free, он даст вам тот же результат. Единственное, что делает malloc () - резервирует место по этому адресу. Единственное, что делает free - это освобождает его (скорее всего, пометьте этот адрес как пригодный для хранения других вещей, «очистка» будет занимать много времени). Вот почему установка указателя на NULL после освобождения - хорошая идея; потому что вы можете быть уверены, что указатель связан с чем-то или нет.

...