C ++ 03标准说:
5.3.5删除
[...]在任何一种方法中,如果delete的操作数的值是空指针,则该操作无效。[...]
char *p = nullptr;
delete p; //no effect
这意味着,在c ++中删除空指针是有效的。
关于在nullptr指针上调用delete,C ++ 17标准说了什么?
答案 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,它澄清了即使在这种情况下调用标准库释放函数,也没有效果:
提供给解除分配函数的第一个参数的值可以是空指针值;如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫无效。