在 NULL 指针上调用 delete 或 delete[] [重复]

Posted

技术标签:

【中文标题】在 NULL 指针上调用 delete 或 delete[] [重复]【英文标题】:Calling delete or delete[] on NULL pointer [duplicate] 【发布时间】:2018-10-21 17:38:40 【问题描述】:

在调用 deletedelete[] 之前总是忽略 NULL 指针检查是否安全,尤其是在编写跨平台代码部分时?

我记得几年前(三到四年)我编写的相同代码在 MS Windows 上运行(使用 MSVCv12 工具链编译)但使用 g++ 为 Linux 编译的版本(不幸的是,我不记得 g++ 版本)抛出 NULL指针引用。我发现当时可能是编译器错误。

我找到了this SO thread,但在阅读后我仍然不太确定它是否安全,如果安全的话 - 来自哪个版本的 C++ 标准?

【问题讨论】:

“抛出 NULL 指针引用”是什么意思? "我发现当时可能是编译器错误。" 编译器如何检查被删除的指针是nullptr,并发出错误为了它? @AlgirdasPreidžius 很确定他们的意思是“编译器错误”。 没错,我的意思是“编译器错误”而不是“编译器错误”。我很抱歉我的错误。 possible duplication? 【参考方案1】:

是的,从 C++98 开始,标准保证空指针上的 deletedelete[] 无效。

C++98 §5.3.5/2

在任一替代方案中,如果delete 的操作数的值为空指针,则该操作无效。

在第一个标准之前也是如此,当时语言是由注释参考手册定义的。


关于

使用 g++ 为 Linux 编译的版本(不幸的是,我不记得 g++ 版本)抛出 NULL 指针引用

如果没有重现行为的具体且最好是完整的示例,就无法讨论。它与删除空指针无关。

【讨论】:

关于 C++11 及更高版本有一个小细节:如果指针为空,则未指定是否调用释放函数,因此如果用户重新实现释放函数将是不安全的如果指针为 nullptr,则可能会导致故障或 UB。但这是制作耙子然后踩在上面的情况 @Swift -- operator deleteoperator delete[] 需要合理地处理空指针。 “要求:[指针参数] 应为空指针或其值应为先前调用 [operator new] 时返回的值”。 [new.delete.single],在 [new.delete.array] 中重复。如果您替换 operator delete,您会注意到您的版本可以使用空指针调用。 @PeteBecker 我知道,但有些人不知道。在 SO 上有关于此的问题。我只是注意到这是不安全行为的来源,除了非常好的和赞成的答案。问题是,当我们编写 delete 时,它​​是 delete 表达式,它依赖于用户提供的 operator delete(如果存在)。就像使用 new-expression 编译器一样,它充当调解器。有些人认为编译器会解决这个问题,而 ISO 未定义

以上是关于在 NULL 指针上调用 delete 或 delete[] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除 null void* 指针是未定义的行为吗?

为啥 delete 不将指针设置为 NULL?

delete和delete[]的误用

C语言中, 为了避免野指针,是否可以在free和delete之后,把指针置为NULL就可以避免了?

调用 operator delete 时的断言

delete指针以后应赋值为NULL