You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++标准不保证delete空指针时不调用内存释放函数?

关于delete空指针的标准规则与提案

标准与参考说明

C++20标准规定:

若delete-expression的操作数为空指针值,是否会调用上述的deallocation function是未指定的。

而cppreference指出:

若表达式求值结果为空指针值,则不会调用析构函数,deallocation function可能被调用也可能不被调用(属于未指定行为),但默认deallocation function在传入nullptr时保证不会执行任何操作。

核心疑问

当delete-expression的操作数为空时,编译器为何要允许调用deallocation function?如果能明确规定此时不调用该函数,规则会更简单,但显然标准如此设定必然存在合理原因。

改进提案

在我看来,delete ptr;应被定义为等价于以下代码:

if (ptr) {
   // 调用析构函数
   // 调用deallocation function
}

若编译器已知ptr为空或非空,可针对性进行优化。同时deallocation function可假设其参数非空,因此无需在内部重复进行!= nullptr的检查。我认为这样的规则会更简洁清晰。


内容的提问来源于stack exchange,提问作者Dr. Gut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:30:12