it-roy-ru.com

Это хорошая практика, чтобы освободить указатель NULL в C?

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

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

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

63
rid

Цитируя стандарт C, 7.20.3.2/2 из ISO-IEC 9899 :

void free(void *ptr);

Если ptr является нулевым указателем, никаких действий не происходит.

Не проверяйте NULL, он только добавляет больше фиктивного кода для чтения и поэтому является плохой практикой.


Однако вы должны всегда проверять указатели NULL при использовании malloc & co. В этом случае NULL означает, что что-то пошло не так, скорее всего, память не была доступна.

132
orlp

Рекомендуется не проверять NULL перед вызовом free. Проверка просто добавляет ненужный беспорядок в ваш код, и free(NULL) гарантированно безопасен. Из раздела 7.20.3.2/2 стандарта C99:

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

19
jamesdlin

Случайно прибегая к помощи поискового запроса http://linux.die.net/man/3/free , который гласит:

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

5
Hello71

На мой взгляд, нет, по крайней мере, не в вашем случае.

Если вы не можете выделить память, вы должны проверить этот путь перед вызовом бесплатно.

4
George