为何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
相关产品推荐
相关产品推荐

