C++20 标准说(参见[expr.delete])
如果删除表达式的操作数的值为空指针值,则未指定是否将如上所述调用释放函数。
cppreference.com 说(请参阅删除表达式)
如果表达式计算结果为空指针值,则不会调用析构函数,并且可能会或可能不会调用释放函数(未指定),但保证默认释放函数在传递空指针时不执行任何操作。
如果删除表达式的操作数为 null,为什么编译器会调用释放函数?
如果可以保证不会调用释放函数,则规则会更简单,但我认为标准允许这样做是有充分理由的。
提案:我认为delete ptr;应该指定为与此等效:
if (ptr) {
// call dtor.
// call deallocation function
}
Run Code Online (Sandbox Code Playgroud)
如果ptr已知为空或不为空,我们就会进行相应的优化。释放函数会假设它们的参数不为空,因此不会!= nullptr发生双重检查。
我认为这个更简单。