Является ли хорошей практикой освобождение NULL-указателя в C?
Возможный дубликат:
Есть ли бесплатный (ptr), где ptr является NULL поврежденной памятью?
Я пишу функцию C, которая освобождает указатель, если он был malloc()
ed. Указатель может быть либо NULL (в случае, когда произошла ошибка, так и у кода не было возможности выделить что-либо) или выделено с помощью malloc()
. Можно ли использовать free(ptr);
вместо if (ptr != NULL) free(ptr);
?
gcc
вообще не жалуется даже на -Wall -Wextra -ansi -pedantic
, но это хорошая практика?
Ответы
Ответ 1
Цитирование стандарта C, 7.20.3.2/2 из ISO-IEC 9899:
void free(void *ptr);
Если ptr
- нулевой указатель, никаких действий не происходит.
Не проверяйте NULL
, он только добавляет больше фиктивного кода для чтения и, следовательно, является плохой практикой.
Однако при использовании malloc
и co, вы должны всегда проверять указатели NULL
. В этом случае NULL
означает, что что-то пошло не так, скорее всего, нет памяти.
Ответ 2
Не рекомендуется проверять NULL
перед вызовом free
. Проверка просто добавляет ненужный беспорядок в ваш код, и free(NULL)
гарантированно будет в безопасности. Из раздела 7.20.3.2/2 стандарта C99:
Свободная функция заставляет пространство, на которое указывает ptr, освободиться, т.е. сделано доступный для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит.
Ответ 3
Случайно googling появляется http://linux.die.net/man/3/free, который гласит:
Если ptr равно NULL, операция не выполняется.
Ответ 4
По-моему, нет, по крайней мере, не в вашем случае.
Если вы не могли выделить память, вы должны были проверить этот WAY перед вызовом бесплатного.