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

时间:2017-11-17 16:12:38

标签: c++ language-lawyer c++17 delete-operator nullptr

C ++ 03标准说:

  

5.3.5删除

     

[...]在任何一种方法中,如果delete的操作数的值是空指针,则该操作无效。[...]

char *p = nullptr;
delete p; //no effect

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

关于在nullptr指针上调用delete,C ++ 17标准说了什么?

2 个答案:

答案 0 :(得分:11)

是的,它是有效的,它会产生一个noop。 reference

  

如果expression的计算结果为空指针值,则不会调用析构函数,也不会调用deallocation函数。

答案 1 :(得分:5)

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

  

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

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

对于解除分配,[expr.delete]/7

  

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

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

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

  

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