Делает ли free (ptr), где ptr-это нулевая поврежденная память?


теоретически я могу сказать, что

free(ptr);
free(ptr); 

- это повреждение памяти, так как мы освободить память, которая уже была освобождена.

но если

free(ptr);
ptr=NULL;
free(ptr); 

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

является ли освобождение нулевого указателя допустимым?

10 87

10 ответов:

7.20.3.2 в free функции

справка

#include <stdlib.h> 
void free(void *ptr); 

описание

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

посмотреть ISO-IEC 9899.

это, как говорится, при взгляде на различные кодовые базы в дикой природе, вы заметите люди иногда делают:

if (ptr)
  free(ptr);

это потому, что некоторые c времени выполнения (я точно помню, что это было на PalmOS) будет сбой при освобождении a NULL указатель.

но в наше время, я считаю, что это безопасно предположить free(NULL) является nop в соответствии с инструкцией по стандарту.

все совместимые со стандартами версии библиотеки C рассматривают free (NULL) как no-op.

тем не менее, в свое время было несколько версий free, которые рухнули бы на free(NULL), поэтому вы можете увидеть некоторые методы защитного программирования рекомендуют:

if (ptr != NULL)
    free(ptr);

Если ptr равно NULL, операция не выполняется.

написано в документации.

Я помню, как работал на PalmOS, где free(NULL) разбился.

free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

вы можете безопасно удалить нулевой указатель. Никакая операция не будет выполнена в этом case.In другие слова free () ничего не делает на нулевом указателе.

рекомендуемое использование:

free(ptr);
ptr = NULL;

посмотреть:

man free

     The free() function deallocates the memory allocation pointed to by ptr.
     If ptr is a NULL pointer, no operation is performed.

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

free(NULL) совершенно законно в C, а также delete (void *)0 и delete[] (void *)0 юридические в C++.

кстати, освобождение памяти дважды обычно вызывает какую-то ошибку времени выполнения, поэтому она ничего не повреждает.

free (ptr) сохраняется в C, если ptr равен NULL, однако большинство людей не знают, что NULL не должен быть равен 0. У меня есть хороший пример старой школы: на C64, по адресу 0, есть IO-порт. Если вы написали программу на C доступ к этому порту, вам понадобится указатель, значение которого равно 0. Тогда библиотека coresponding c должна была бы различать 0 и NULL.

с уважением

Не повреждение памяти, но поведение зависит от реализации. По стандарту это должен быть юридический кодекс.

ptr указывает на некоторую область памяти, скажем 0x100.

когда вы освобождаете (ptr), в основном вы позволяете 0x100 использоваться диспетчером памяти для использования для другой деятельности или процесса, и простыми словами это освобождение ресурсов.

когда вы делаете ptr=NULL, вы делаете ptr указать на новое место(давайте не беспокоиться о том, что NULL). При этом вы потеряли данные памяти 0x100.Вот что такое утечка памяти.

поэтому не рекомендуется используйте ptr=NULL для допустимого ptr.

вместо этого вы можете сделать некоторые безопасные проверки с помощью:

Если(ptr != НЕДЕЙСТВИТЕЛЬНЫЙ) {free (ptr);}

когда вы освобождаете (ptr), где ptr уже указывает на NULL, он не выполняет operation.So, это безопасно сделать так.