Теоретически могу сказать, что
free(ptr);
free(ptr);
- это повреждение памяти, поскольку мы освобождаем уже освобожденную память.
А вдруг
free(ptr);
ptr=NULL;
free(ptr);
Поскольку ОС будет вести себя неопределенным образом, я не могу получить фактический теоретический анализ происходящего. Что бы я ни делал, это повреждение памяти или нет?
Действителен ли освобождение нулевого указателя?
delete NULL
недопустим в C ++. delete может применяться к значениям нулевого указателя конкретного типа, но не кNULL
.delete (int*) NULL
законно, но неdelete NULL
.ptr
указывает на память, а вы не обращаетесь кfree
ней, память будет протекать. Установка этого значенияNULL
просто теряет контроль над памятью и дает утечку. Еслиptr
случаетсяNULL
, вызывающийfree
не представляет никакой операции.free(ptr)
наptr = NULL
. Никто ничего подобного не сказал.Ответы:
См. ISO-IEC 9899 .
При этом, глядя на разные кодовые базы в дикой природе, вы заметите, что люди иногда делают:
Это связано с тем, что некоторые среды выполнения C (я точно помню, что это было в случае с PalmOS) зависали при освобождении
NULL
указателя.Но в настоящее время я считаю, что можно с уверенностью предположить,
free(NULL)
что это не так, как указано в стандарте.источник
free(ptr)
гдеptr
находится нуль не имеет побочных эффектов. Но в любом случае каждая память, выделенная с использованиемmalloc()
илиcalloc()
должна быть впоследствии освобождена с использованиемfree()
free(NULL)
, проверяя указательNULL
перед вызовомfree()
Все совместимые со стандартами версии библиотеки C трактуют свободный (NULL) как неработающий.
Тем не менее, в свое время были некоторые версии бесплатного ПО, которые вылетали из-за бесплатного использования (NULL), поэтому вы можете увидеть, что рекомендуют некоторые методы защитного программирования:
источник
говорит документация.
источник
Я помню, как работал над PalmOS, где произошел
free(NULL)
сбой.источник
NULL
были одним из больших отличий панели инструментов Palm от стандартной библиотеки.Вы можете безопасно удалить ПУСТОЙ указатель. В этом случае никакая операция выполняться не будет. Другими словами, free () ничего не делает с указателем NULL.
источник
Рекомендуемое использование:
Видеть:
Когда вы устанавливаете указатель на
NULL
после,free()
вы можете вызватьfree()
его снова, и никакая операция выполняться не будет.источник
free(NULL)
совершенно законно в С, а такжеdelete (void *)0
иdelete[] (void *)0
являются законными в C ++.Кстати, двойное освобождение памяти обычно вызывает какую-то ошибку времени выполнения, поэтому ничего не портит.
источник
delete 0
недопустима в C ++.delete
явно требует выражения типа указателя. Допустимо применятьdelete
к типизированному значению нулевого указателя, но не к0
(и не кNULL
).void*
: P Какие деструкторы следует запускать?void *
если это нулевой указатель.buf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1);
- здесь, если вам не повезло, buf2 получил тот же адрес, что и buf1, и вы случайно освободили buf1 дважды, поэтому на втором этапе, свободном от buf1, вы фактически освободили buf2 тихо, без причинения вреда. любая (имитация) ошибка / сбой / что угодно. (но у вас все равно, вероятно, произойдет сбой в следующий раз, когда вы попытаетесь использовать buf2 - и этот сценарий очень маловероятен, если вы работаете на ASLR)free(ptr)
сохраняется в C, еслиptr
естьNULL
, однако большинство людей не знают, что онNULL
не обязательно должен быть равен 0. У меня есть хороший пример старой школы: на C64 по адресу 0 есть порт ввода-вывода. Если вы написали программу на C, обращающуюся к этому порту, вам понадобится указатель со значением 0. Соответствующая библиотека C должна будет различать 0 иNULL
затем.С уважением.
источник
не повреждение памяти, но поведение зависит от реализации. По стандарту это должен быть юридический кодекс.
источник
ptr указывает на некоторую ячейку памяти, скажем, 0x100.
Когда вы освобождаете (ptr), в основном вы разрешаете диспетчеру памяти использовать 0x100 для других действий или процессов, и простыми словами это освобождение ресурсов.
Когда вы делаете ptr = NULL, вы указываете ptr на новое место (не беспокойтесь о том, что такое NULL). При этом вы потеряли данные памяти 0x100 - вот что такое утечка памяти.
Поэтому не рекомендуется использовать ptr = NULL для действительного ptr.
Вместо этого вы можете выполнить некоторую безопасную проверку, используя:
if (ptr! = NULL) {бесплатно (ptr);}
Когда вы освобождаете (ptr), где ptr уже указывает на NULL, он не выполняет никаких операций, поэтому это безопасно.
источник