Подтвердить что ты не робот

Освобождение нулевого указателя

Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на NULL? Действительно ли это действительно?

Почему в нем не отображаются сообщения об ошибках/сообщениях?

4b9b3361

Ответ 1

Из раздела C99 7.20.3.2: свободная функция

Сводка

 1 #include <stdlib.h>
   void free(void *ptr);

Описание

2 Свободная функция заставляет пространство, на которое указывает ptr, освободиться, т.е. сделано доступный для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит.

Ответ 3

освобождение нулевого указателя не повлияет на выполнение.

Ответ 4

Когда-то очень давно существовали реализации "free()", которые разбились, когда ему был присвоен пустой указатель на свободный. Это относится только к реализациям, которые предваряют стандарт C89 (C90), который не был изменен для решения проблемы с тех пор.

По моему опыту, по сути, ни одна из этих реализаций не оставлена ​​(и не должна быть), поэтому теперь безопасно освобождать нулевые указатели.

Если у вас есть какие-либо требования к порту в чрезвычайно странные и древние системы, то, возможно, вы все равно будете осторожны. С другой стороны, если бы у вас были такие системы, о которых вы могли бы беспокоиться, вы, вероятно, знаете об этой проблеме (и о множестве других проблем), - либо вокруг кода, который указывает это, будут некоторые общие знания.

Ответ 5

Я бы пошел за:

#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

; - ||

Ответ 6

Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на НОЛЬ. действительно ли это?

Ничего.

почему он не показывает никаких предупреждений/ошибок сообщения?

Во-первых, поведение действительно по определению, поэтому никаких ошибок или предупреждений не требуется.

Во-вторых, указатель указывает на NULL во время выполнения. Как отображать предупреждение или сообщение об ошибке, если вообще? Представьте себе, что вы играете в игру под названием Kill the Zombie, и пока двое из этих существ атакуют вас, появляется сообщение об ошибке всплывающего окна, в котором говорится: "Предупреждение, указатель NULL освобожден".

Ответ 7

Это может быть безопасно (я этого не знал, но другие ответы, похоже, предлагают это), но я не буду привыкать к тому, чтобы не заботиться о том, является ли указатель уже нулевым. Назначение p = NULL; после каждого бесплатного скоро следует в качестве следствия. Это опасно в многопоточных приложениях, так как после этого назначения p может использоваться другим потоком и будет снова освобожден текущим потоком, пока он ожил другими потоками.

Каждая память malloc'd должна быть освобождена один раз. Период.