C++17标准对在nullptr上调用delete有何规定



C++03标准,例如:

5.3.5删除

[…]在任意一种情况下,如果delete操作数的值是空指针,则该操作无效。[…]

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

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

C++17标准对在nullptr指针上调用delete有何规定?

是的,它是有效的,并且会导致noop。参考

如果表达式的计算结果为空指针值,则不会调用析构函数,也不会调用释放函数。

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

如果删除表达式的操作数值不是空指针值,则的删除表达式将调用要删除的对象或数组元素的析构函数(如果有)。

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

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

如果删除表达式的操作数的值是空指针值,则未指定是否会如上所述调用释放函数。

未指定的解除分配,但可能没有销毁。

另请注意,从[basic.stc.dynamic.deallosition]/3中,它阐明了即使在这种情况下调用标准库的deallosition函数,也不会产生任何影响:

提供给解除分配函数的第一个参数的值可以是空指针值;如果是这样,并且deallocation函数是标准库中提供的函数,则该调用没有任何作用。

最新更新