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

Что происходит в памяти, если мы пытаемся освободить указатель, который указывает на ПУСТОЙ УКАЗАТЕЛЬ? Это когда-либо допустимо?

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

36
задан Jonathan Leffler 11 March 2010 в 14:15
поделиться

7 ответов

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

Краткое содержание

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

Описание

2 Функция free вызывает освобождение пространства, на которое указывает ptr, то есть делает { {1}} доступны для дальнейшего размещения. Если ptr - нулевой указатель, никаких действий не происходит .

57
ответ дан 27 November 2019 в 05:28
поделиться

Из http://linux.die.net/man/3/malloc :

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

14
ответ дан 27 November 2019 в 05:28
поделиться

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

Ничего.

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

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

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

2
ответ дан 27 November 2019 в 05:28
поделиться

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

6
ответ дан 27 November 2019 в 05:28
поделиться

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

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

1
ответ дан 27 November 2019 в 05:28
поделиться

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

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

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

5
ответ дан 27 November 2019 в 05:28
поделиться

Я бы выбрал:

#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

; - ||

5
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: