Каково различие между освобождением указателя и присвоением его к ПУСТОМУ УКАЗАТЕЛЮ?

Мог кто-то говорить мне различие между:

int *p;
p=(int*)malloc(10*sizeof(int));
free(p);

или

int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
22
задан Lazer 26 September 2010 в 18:11
поделиться

6 ответов

free деаллоцирует память, на которую указывает p - простое присвоение NULL этого не сделает (и таким образом вы получите утечку памяти).

Стоит отметить, что хорошей практикой является присвоение указателя на NULL ПОСЛЕ вызова free, так как это предотвратит случайную попытку доступа к освобожденной памяти (что все еще возможно, но категорически не следует делать).

40
ответ дан 29 November 2019 в 03:44
поделиться

В C нет сборки мусора, поэтому, если вы явно не освободите кусок памяти, он никогда не будет освобожден, даже если на него нет ссылок. Возможно, у вас есть опыт работы с языками со сборкой мусора, поэтому вам может быть сложно изменить свой образ мыслей, но всегда важно помнить о «ручном» освобождении всех ресурсов на языках низкого уровня, таких как C.

Надеюсь, это поможет Ура

10
ответ дан 29 November 2019 в 03:44
поделиться

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;
7
ответ дан 29 November 2019 в 03:44
поделиться

Освобождение выделенной памяти освобождает ее и позволяет использовать эту память в другом месте, в то время как указатель на то, где была выделена память, сохраняется.

Установка указателя на выделенную память в NULL не освобождает ее.

Если вы используете реализацию, использующую malloc на основе кучи, отладьте то, что выделяет, использует и освобождает память, и сделайте то же самое с тем, что выделяет, использует и устанавливает указатель на память в NULL.

Управление памятью зависит от реализации (см. http://en.wikipedia.org/wiki/Malloc#Implementations ).

1
ответ дан 29 November 2019 в 03:44
поделиться

Отсутствие вызова free и прямое присвоение NULL приведет к утечке памяти, как объяснили другие. Вы можете обратиться к этой ссылке , чтобы получить подробные сведения об утечках памяти и других проблемах, связанных с памятью.

2
ответ дан 29 November 2019 в 03:44
поделиться

Лучше сначала освободить память, а затем установить ее на NULL:

free(p);
p = NULL;
2
ответ дан 29 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: