Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на NULL? Действительно ли это действительно?
Почему в нем не отображаются сообщения об ошибках/сообщениях?
Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на NULL? Действительно ли это действительно?
Почему в нем не отображаются сообщения об ошибках/сообщениях?
Из раздела C99 7.20.3.2: свободная функция
Сводка
1 #include <stdlib.h>
void free(void *ptr);
Описание
2 Свободная функция заставляет пространство, на которое указывает ptr, освободиться, т.е. сделано доступный для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит.
Из http://linux.die.net/man/3/malloc:
Если ptr равно NULL, операция не выполняется.
освобождение нулевого указателя не повлияет на выполнение.
Когда-то очень давно существовали реализации "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
; - ||
Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на НОЛЬ. действительно ли это?
Ничего.
почему он не показывает никаких предупреждений/ошибок сообщения?
Во-первых, поведение действительно по определению, поэтому никаких ошибок или предупреждений не требуется.
Во-вторых, указатель указывает на NULL во время выполнения. Как отображать предупреждение или сообщение об ошибке, если вообще? Представьте себе, что вы играете в игру под названием Kill the Zombie, и пока двое из этих существ атакуют вас, появляется сообщение об ошибке всплывающего окна, в котором говорится: "Предупреждение, указатель NULL освобожден".
Это может быть безопасно (я этого не знал, но другие ответы, похоже, предлагают это), но я не буду привыкать к тому, чтобы не заботиться о том, является ли указатель уже нулевым. Назначение p = NULL;
после каждого бесплатного скоро следует в качестве следствия. Это опасно в многопоточных приложениях, так как после этого назначения p
может использоваться другим потоком и будет снова освобожден текущим потоком, пока он ожил другими потоками.
Каждая память malloc'd должна быть освобождена один раз. Период.