Мог кто-то говорить мне различие между:
int *p;
p=(int*)malloc(10*sizeof(int));
free(p);
или
int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
free
деаллоцирует память, на которую указывает p
- простое присвоение NULL
этого не сделает (и таким образом вы получите утечку памяти).
Стоит отметить, что хорошей практикой является присвоение указателя на NULL
ПОСЛЕ вызова free
, так как это предотвратит случайную попытку доступа к освобожденной памяти (что все еще возможно, но категорически не следует делать).
В C нет сборки мусора, поэтому, если вы явно не освободите кусок памяти, он никогда не будет освобожден, даже если на него нет ссылок. Возможно, у вас есть опыт работы с языками со сборкой мусора, поэтому вам может быть сложно изменить свой образ мыслей, но всегда важно помнить о «ручном» освобождении всех ресурсов на языках низкого уровня, таких как C.
Надеюсь, это поможет Ура
p - указатель (на блок, динамически выделяемый в памяти ["в куче"])
{{1} } Это означает, что p - это переменная, которая содержит адрес в памяти конкретного блока (или некоторого конкретного размера, в этом примере блок, достаточно большой для хранения 10 целых чисел).
free (p);
указывает логике управления памятью (среды выполнения C), что память, ранее занятая блоком, на который указывает p, может быть повторно использована.
p = NULL;
устанавливает значение p равным NULL (адрес, который он ранее содержал, теряется), но блок в памяти, на который он указывает, все еще считается используемым.
Может возникнуть некоторая путаница, потому что в таких языках, как Java, C #, Python и т. Д., Простое присвоение переменной значения NULL (или другого адреса, если на то пошло) автоматически освобождает базовую память (при условии отсутствия других ссылок на этот адрес. существуют в других живых переменных).
Это не так в C или C ++, что приводит к ошибкам, подобным следующим:
free(p);
// possibly some some code etc.
// later:
p[6] = 'a'; // <<--- Ouch we're modifying whatever new variable is there !!!
или
// didn't call free(p)
p = NULL;
// now the memory allocated for p is held in memory even though it
// is not going to be used (assuming no copies of p or of pointers to part
// of that block were made.
Последний случай приводит только к неэффективной трате ресурсов, первый может привести к трудностям для поиска ошибок.
Вот почему типичная идиома языка C такова:
free(p);
p = NULL;
Освобождение выделенной памяти освобождает ее и позволяет использовать эту память в другом месте, в то время как указатель на то, где была выделена память, сохраняется.
Установка указателя на выделенную память в NULL не освобождает ее.
Если вы используете реализацию, использующую malloc на основе кучи, отладьте то, что выделяет, использует и освобождает память, и сделайте то же самое с тем, что выделяет, использует и устанавливает указатель на память в NULL.
Управление памятью зависит от реализации (см. http://en.wikipedia.org/wiki/Malloc#Implementations ).
Отсутствие вызова free и прямое присвоение NULL приведет к утечке памяти, как объяснили другие. Вы можете обратиться к этой ссылке , чтобы получить подробные сведения об утечках памяти и других проблемах, связанных с памятью.
Лучше сначала освободить память, а затем установить ее на NULL:
free(p);
p = NULL;