Свободно (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, он не выполняет никаких операций. Таким образом, это безопасно.