2016-11-11 3 views
0

Я использовал, чтобы убедиться, что указатель не нуля перед освобождением, так что я обычно уничтожить динамически создаваемые структуры, как это:Нужно проверить, является ли нулевым указателем, прежде чем свободный()

Node *destroy_node(Node *node) { 
    if (node) { 
     free(node); 
    } 
    return NULL; 
} 

Но CERT MEM34 предполагает, что, так как свободный() принимает нулевые указатели, я мог бы так написать

Node *destroy_node(Node *node) { 
    free(node); 
    return NULL; 
} 

Является ли это правильно?

ответ

1

Да, минус NULL (константа нулевого указателя) до free().

Цитирование C11, глава §7.22.3.3 (курсив мой)

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

0

Да, проходя NULL к free является не оп.

Выдержка из n1570 (С11 окончательного проект):

7.22.3.3 Свободная Функция Сводки
1 #include пустот (недействительный * PTR);
Описание
2 Свободная функция заставляет пространство, на которое указывает ptr, освобождается, то есть становится доступным для дальнейшего выделения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не соответствует указателю, ранее возвращенному функцией управления памятью, или если пространство было освобождено вызовом free или realloc, поведение не определено.
Возврат
3 Свободная функция не возвращает значение.

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