在 NULL 指针上调用 delete 或 delete[] [重复]
Posted
技术标签:
【中文标题】在 NULL 指针上调用 delete 或 delete[] [重复]【英文标题】:Calling delete or delete[] on NULL pointer [duplicate] 【发布时间】:2018-10-21 17:38:40 【问题描述】:在调用 delete 或 delete[] 之前总是忽略 NULL 指针检查是否安全,尤其是在编写跨平台代码部分时?
我记得几年前(三到四年)我编写的相同代码在 MS Windows 上运行(使用 MSVCv12 工具链编译)但使用 g++ 为 Linux 编译的版本(不幸的是,我不记得 g++ 版本)抛出 NULL指针引用。我发现当时可能是编译器错误。
我找到了this SO thread,但在阅读后我仍然不太确定它是否安全,如果安全的话 - 来自哪个版本的 C++ 标准?
【问题讨论】:
“抛出 NULL 指针引用”是什么意思? "我发现当时可能是编译器错误。" 编译器如何检查被删除的指针是nullptr
,并发出错误为了它?
@AlgirdasPreidžius 很确定他们的意思是“编译器错误”。
没错,我的意思是“编译器错误”而不是“编译器错误”。我很抱歉我的错误。
possible duplication?
【参考方案1】:
是的,从 C++98 开始,标准保证空指针上的 delete
或 delete[]
无效。
C++98 §5.3.5/2
” 在任一替代方案中,如果
delete
的操作数的值为空指针,则该操作无效。
在第一个标准之前也是如此,当时语言是由注释参考手册定义的。
关于
” 使用 g++ 为 Linux 编译的版本(不幸的是,我不记得 g++ 版本)抛出 NULL 指针引用
如果没有重现行为的具体且最好是完整的示例,就无法讨论。它与删除空指针无关。
【讨论】:
关于 C++11 及更高版本有一个小细节:如果指针为空,则未指定是否调用释放函数,因此如果用户重新实现释放函数将是不安全的如果指针为 nullptr,则可能会导致故障或 UB。但这是制作耙子然后踩在上面的情况 @Swift --operator delete
和 operator delete[]
需要合理地处理空指针。 “要求:[指针参数] 应为空指针或其值应为先前调用 [operator new] 时返回的值”。 [new.delete.single],在 [new.delete.array] 中重复。如果您替换 operator delete,您会注意到您的版本可以使用空指针调用。
@PeteBecker 我知道,但有些人不知道。在 SO 上有关于此的问题。我只是注意到这是不安全行为的来源,除了非常好的和赞成的答案。问题是,当我们编写 delete 时,它是 delete 表达式,它依赖于用户提供的 operator delete(如果存在)。就像使用 new-expression 编译器一样,它充当调解器。有些人认为编译器会解决这个问题,而 ISO 未定义以上是关于在 NULL 指针上调用 delete 或 delete[] [重复]的主要内容,如果未能解决你的问题,请参考以下文章