Делает ли free (ptr), где ptr-это нулевая поврежденная память?
теоретически я могу сказать, что
free(ptr);
free(ptr);
- это повреждение памяти, так как мы освободить память, которая уже была освобождена.
но если
free(ptr);
ptr=NULL;
free(ptr);
поскольку ОС будет вести себя неопределенным образом, я не могу получить фактический теоретический анализ для этого о том, что происходит. Что бы я ни делал, это повреждение памяти или нет?
является ли освобождение нулевого указателя допустимым?
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);
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, это безопасно сделать так.