освобождение нулевого указателя - PullRequest
34 голосов
/ 01 марта 2010

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

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

Ответы [ 7 ]

54 голосов
/ 01 марта 2010

Из раздела C99 7.20.3.2: функция free

Синопсис

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

Описание

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

14 голосов
/ 01 марта 2010

С http://linux.die.net/man/3/malloc:

Если ptr равен NULL, никакая операция не выполняется.

6 голосов
/ 01 марта 2010

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

5 голосов
/ 02 марта 2010

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

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

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

5 голосов
/ 01 марта 2010

Я бы пошел на:

#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

; - ||

2 голосов
/ 01 марта 2010

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

Ничего.

почему не отображается предупреждение / ошибка сообщения

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

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

1 голос
/ 01 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...