为啥可以用空指针调用free?

Posted

技术标签:

【中文标题】为啥可以用空指针调用free?【英文标题】:Why is it okay to call free with null pointer?为什么可以用空指针调用free? 【发布时间】:2022-01-11 17:56:42 【问题描述】:

从 C 标准中可以清楚地看出,NULLfree() 的可接受输入,结果是不执行任何操作。但是,这似乎违反了 free() 只能在使用 malloc()calloc()realloc() 显式分配的内存上调用的想法。

这个异常背后的原因是什么?我能想到的唯一原因是,调用者不必在调用free() 之前明确检查NULL

【问题讨论】:

NULL 是来自malloc 和朋友的有效返回值。所以任何构造 free(malloc(...)) 都是有效的。 很难回答有关编程语言推理的问题。 not 允许free(NULL) 有什么好处?在这种情况下您会遇到什么错误? 【参考方案1】:

如果请求的大小为 0,malloc 函数(以及 callocrealloc)可能会返回 NULL 指针。因此,NULL 指针也可以传递给 free 是有意义的,因为它从成功调用malloc返回:

C standard 的第 7.22.3p1 节指定了这种行为:

如果无法分配空间,则返回空指针。如果 请求的空间大小为零,行为是 实现定义:要么返回一个空指针,要么 行为就像大小是一些非零值,除了 返回的指针不能用于访问对象。

【讨论】:

以上是关于为啥可以用空指针调用free?的主要内容,如果未能解决你的问题,请参考以下文章

java String.valueOf(null)为啥会报空指针

为啥代码会通过空指针显式调用静态方法?

关于C语言free函数的问题

为啥free函数不在释放内存后,将指针置NULL,野指针有啥用

C语言free释放内存后为啥指针里的值不变?竟然还可以输出

为啥我们要在 free() 释放内存后清空指针? [复制]