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

Является ли хорошей практикой освобождение NULL-указателя в C?

Возможный дубликат:
Есть ли бесплатный (ptr), где ptr является NULL поврежденной памятью?

Я пишу функцию C, которая освобождает указатель, если он был malloc() ed. Указатель может быть либо NULL (в случае, когда произошла ошибка, так и у кода не было возможности выделить что-либо) или выделено с помощью malloc(). Можно ли использовать free(ptr); вместо if (ptr != NULL) free(ptr);?

gcc вообще не жалуется даже на -Wall -Wextra -ansi -pedantic, но это хорошая практика?

4b9b3361

Ответ 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 перед вызовом бесплатного.