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


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

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

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

4 57

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, операция не выполняется.

по-моему, нет, по крайней мере, не в вашем случае.

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