关于在nullptr上调用delete的C++ 17标准是什么意思?

msc*_*msc 2 c++ nullptr language-lawyer delete-operator c++17

C++ 03标准说:

5.3.5删除

[...]在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.[...]

char *p = nullptr;
delete p; //no effect
Run Code Online (Sandbox Code Playgroud)

这意味着,在c ++中删除空指针是有效的.

关于在nullptr指针上调用delete的C++ 17标准是什么意思?

Cor*_*mer 12

是的它是有效的,它会产生一个noop.参考

如果expression求值为空指针值,则不调用析构函数,并且不调用释放函数.


Bar*_*rry 5

对于析构函数,[expr.delete]/6:

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用该对象的析构函数(如果有)或要删除的数组的元素.

从技术上讲,如果操作数空指针值,则不会调用析构函数.可能是一个轻微的措辞问题?

对于释放,[expr.delete]/7:

如果delete-expression的操作数的值是空指针值,则不指定是否将如上所述调用释放函数.

未指定的释放,但可能没有破坏.

另请注意,来自[basic.stc.dynamic.deallocation]/3,它澄清了即使在这种情况下调用标准库释放函数,也没有效果:

提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.