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

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

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

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

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

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

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

  • @property сохранять, назначать, копировать, неатомически в Objective-C
  • bds 2006 C конфликты с скрытым диспетчером памяти (class new / delete vs. AnsiString)
  • Как я могу получить размер блока памяти, выделенного с помощью malloc ()?
  • Почему NSNumber такие странные saveCounts?
  • Распределение памяти / освобождение Узкое место?
  • Go 1.3 Сборщик мусора, не отбрасывающий серверную память обратно в систему
  • В каких случаях я использую malloc vs new?
  • почему размер памяти стека настолько ограничен?
  • Объем памяти типов данных Haskell
  • Как создать массив структур с динамическим размером?
  • Трюки для управления доступной памятью в сеансе R
  • Interesting Posts

    Как я могу анализировать даты и преобразовывать часовые пояса в Perl?

    Чтение двоичного файла и использование Response.BinaryWrite ()

    объявление priority_queue в c ++ с помощью пользовательского компаратора

    Как я могу скопировать большой файл с одной машины Windows на другую предельную скорость передачи?

    Объединение Rails с несколькими внешними ключами

    База данных nosql хороша для управления транзакциями онлайн-денег

    Почему используется if (! $ Scope. $$ phase) $ scope. $ Apply () анти-шаблон?

    Как получить информацию о видеофайлах из командной строки под Linux

    CodeIgniter автоматически предотвращает SQL-инъекцию?

    Вызов функции GWT Java из JavaScript

    Проверьте, имеет ли браузер встроенную проверку HTML5?

    LINQ, Невозможно создать постоянное значение типа XXX. В этом контексте поддерживаются только примитивные типы или типы перечислений

    Перечисления Java, enums JPA и Postgres – Как мне заставить их работать вместе?

    Как узнать, какое хранилище ключей было использовано для подписи приложения?

    Google Chrome продолжает разбивать вкладки

    Давайте будем гением компьютера.