是否有必要在free()之前检查指针是否为null

时间:2016-11-11 11:06:58

标签: c pointers memory-management struct free

用于确保指针在释放之前不为空,所以我通常会破坏动态创建的结构,如下所示:

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

但是CERT MEM34表明,由于free()接受空指针,我还可以写

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

这是对的吗?

2 个答案:

答案 0 :(得分:1)

是的,将NULL(空指针常量)传递给free()完全有效。

引用C11,章节§7.22.3.3,(强调我的

  

free函数导致ptr指向的空间被释放,即   可供进一步分配。 如果ptr是空指针,则不会执行任何操作。 [...]

答案 1 :(得分:0)

是的,将NULL传递给free是无操作。

摘自n1570(C11最终稿):

  

7.22.3.3自由功能   简介
  1 #include void free(void * ptr);
  说明
  2 free函数导致ptr指向的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。
  返回
  3 free函数不返回任何值。