2013-09-12 3 views
6

Предположим, я наткнулся на экземпляр в программе, где я бы либо выслал NULL-указатель, либо сначала проверил, был ли он NULL и пропустил вызов функции free().Бесплатный нуль-указатель или в первую очередь?

Было бы более эффективным просто освободить указатель NULL? Я немного искал и, видимо, для реализаций пост C89, безвредно освобождать указатель NULL, поэтому решение сводится к эффективности.

Моя презумпция заключается в том, что при вызове free() может возникнуть немало накладных расходов. Таким образом, возможно, простая логическая проверка перед вызовом функции free() вполне необходима.


ТЛ; дг версии

Что происходит внутри, когда вызов free() сделан, что может сделать его более или менее эффективным первым проверить, является ли или NULL указатель перед освобождением?

+0

Что? Tldr не имеет никакого отношения к вашему вопросу! –

+0

Сделал это немного конкретнее, но это были служебные данные, связанные с вызовом 'free()', с которым я был связан. – sherrellbc

+0

free (NULL) гарантированно будет no-op с c89. BTW: не слишком одержимы работой. Единственное различие заключается в том, что NULL-проверка выполняется внутри или снаружи функции free(). – wildplasser

ответ

8

Стандарт C гарантирует, что вызов free(NULL) безвреден и не имеет эффекта. Итак, если вы не верите, что вызов free() на указателе NULL указывает на то, что у вас есть логическая ошибка в другом месте вашей программы, нет причин для двойной проверки этого.

7

Не проверяйте значение nullness самостоятельно. free уже должен сделать это в любом случае, и при вызове с нулевым указателем не будет ничего делать. Просто как тот.

+0

Я вижу - так вот, как NULL бесплатно безвреден. – sherrellbc

4

The Open Group specification for free() утверждает, что:

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

Это означает, что реализация free(), вероятно, начать с чего-то эффект:

if (ptr == NULL) 
    return; 

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

+0

Я посмотрю ваш POSIX.1-2001 и подниму вас [POSIX.1-2008] (http://pubs.opengroup.org/onlinepubs/9699919799/). [ 'Свободный()'] (HTTP: //pubs.opengroup.орг/onlinepubs/9699919799/функции/free.html). –

Смежные вопросы