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