Что происходит в памяти, если мы пытаемся освободить указатель, который указывает на ПУСТОЙ УКАЗАТЕЛЬ? Это когда-либо допустимо?
Почему это не показывает предупреждения/сообщений об ошибках?
Из раздела 7.20.3.2 C99: Функция free
Краткое содержание
1 #include <stdlib.h>
void free(void *ptr);
Описание
2 Функция free вызывает освобождение пространства, на которое указывает ptr, то есть делает { {1}} доступны для дальнейшего размещения. Если ptr - нулевой указатель, никаких действий не происходит .
Из http://linux.die.net/man/3/malloc :
Если ptr равен NULL, операция не выполняется.
Что произойдет внутри памяти, если мы попытаемся освободить указатель, указывающий на NULL. это когда-нибудь действительно?
Ничего.
почему он не показывает никаких предупреждений / сообщений об ошибках ?
Во-первых, поведение допустимо по определению, поэтому выдавать ошибки или предупреждения не требуется.
Во-вторых, во время выполнения указатель указывает на NULL. Как должно отображаться предупреждение или сообщение об ошибке, если вообще? Представьте, что вы играете в игру под названием Kill the Zombie, и пока двое из этих существ атакуют вас, появляется всплывающее сообщение об ошибке: «Предупреждение, нулевой указатель освобожден».
освобождение нулевого указателя не повлияет на выполнение.
Это может быть безопасно (я этого не знал, но другие ответы, похоже, предполагают это), но Я не буду иметь привычки не заботиться о том, является ли указатель уже нулевым. Присваивание p = NULL;
после каждого освобождения вскоре следует как следствие. Это опасно для многопоточных приложений, так как после этого назначения p
может использоваться другим потоком и будет снова освобожден текущим потоком, в то время как ожидается, что он будет активен другими потоками.
Каждая память malloc'd должна быть освобождена один раз. Период.
Давным-давно существовали реализации 'free ()', которые давали сбой при получении нулевого указателя на free. Это применимо только к реализациям, предшествующим стандарту C89 (C90), которые с тех пор не были изменены для решения этой проблемы.
По моему опыту, практически не осталось ни одной из этих реализаций (и быть не должно), поэтому теперь можно безопасно освобождать нулевые указатели.
Если у вас есть какие-либо требования для переноса на чрезвычайно странные и древние системы, то, возможно, вам все же следует быть осторожными. С другой стороны, если бы у вас были такие системы, о которых нужно было беспокоиться, вы, вероятно, знали бы об этой проблеме (и о целом ряде других проблем) - или были бы некоторые общие знания о коде, который указывает на это.
Я бы выбрал:
#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS
#define safe_free(x) do { if ((x)) free((x)); } while(0)
#elseif /* feeling gutsy */
#define safe_free(x) free((x))
#endif
; - ||