Свободно (ptr), где ptr является NULL поврежденной памятью?
Теоретически я могу сказать, что
free(ptr);
free(ptr);
- повреждение памяти, так как мы освобождаем уже освобожденную память.
Но что, если
free(ptr);
ptr=NULL;
free(ptr);
Поскольку ОС будет вести себя как undefined, я не могу получить фактический теоретический анализ для этого о том, что происходит.
Что бы я ни делал, это повреждение памяти или нет?
Является ли освобождение указателя NULL действительным?
Ответы
Ответ 1
7.20.3.2 Функция free
Сводка
#include <stdlib.h>
void free(void *ptr);
Описание
Функция free
вызывает освобождение пространства, на которое указывает ptr
, т.е. сделанное доступный для дальнейшего распределения. Если ptr
- нулевой указатель, никаких действий не происходит.
См. ISO-IEC 9899.
При этом, глядя на разные кодовые базы в дикой природе, вы заметите, что люди иногда делают:
if (ptr)
free(ptr);
Это связано с тем, что некоторые C-версии (я точно помню, что это был случай с PalmOS) сбой при освобождении указателя NULL
.
Но в настоящее время я считаю безопасным предположить, что free(NULL)
является nop, как указано в стандарте.
Ответ 2
Все версии, совместимые со стандартами библиотеки C, обрабатывают бесплатно (NULL) как no-op.
Тем не менее, в свое время были некоторые версии бесплатных, которые могли бы сработать бесплатно (NULL), поэтому вы можете увидеть, как некоторые защитные методы программирования рекомендуют:
if (ptr != NULL)
free(ptr);
Ответ 3
Если ptr равно NULL, операция не выполняется.
говорит о документации.
Ответ 4
Я помню, как работал над PalmOS, где free(NULL)
разбился.
Ответ 5
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
Вы можете безопасно удалить указатель NULL. В этом случае операция не будет выполнена. Другими словами, free() ничего не делает с помощью указателя NULL.
Ответ 6
Рекомендуемое использование:
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()
, и никакая операция не будет выполнена.
Ответ 7
free(NULL)
совершенно легален в C, а delete (void *)0
и delete[] (void *)0
являются законными в С++.
Кстати, освобождение памяти дважды обычно вызывает некоторую ошибку времени выполнения, поэтому она ничего не коррумпирует.
Ответ 8
free (ptr) сохраняется в C, если ptr равно NULL, однако большинство людей не знают, что NULL не обязательно должно быть равным 0. У меня есть хороший пример старой школы: на C64 по адресу 0, имеется IO-порт. Если вы написали программу в C, обращаясь к этому порту, вам понадобится указатель, значение которого равно 0. Соответствующая библиотека c должна будет различать от 0 до NULL.
С уважением
Ответ 9
не повреждение памяти, но поведение зависит от реализации.
По стандарту это должен быть юридический код.
Ответ 10
ptr указывает на некоторое место в памяти, скажем 0x100.
Когда вы освобождаете (ptr), в основном вы позволяете использовать 0x100 диспетчером памяти для использования в других целях или процессах, а простыми словами - освобождение ресурсов.
Когда вы выполняете ptr = NULL, вы делаете ptr-точку в новое место (не беспокойтесь о том, что такое NULL). Выполняя это, вы потеряли данные памяти 0x100. Это то, что является утечкой памяти.
Поэтому не рекомендуется использовать ptr = NULL на действительном ptr.
Вместо этого вы можете сделать некоторую безопасную проверку, используя:
if (ptr!= NULL)
{Свободный (PTR);}
Когда вы освобождаете (ptr), где ptr уже указывает на NULL, он не выполняет никаких операций. Таким образом, это безопасно.