在c++0x中删除nullptr仍然安全吗?

Is it still safe to delete nullptr in c++0x?

本文关键字:安全 nullptr c++0x 删除      更新时间:2023-10-16

c++03中,很明显删除空指针没有效果。的确,§5.3.5/2中明确指出:

在两种情况下,如果delete操作数的值为空指针,则该操作无效。

然而,在目前的c++0x草案中,这句话似乎缺失了。在草案的其余部分,我只能找到语句,说明如果删除表达式的操作数不是空指针常数会发生什么。删除空指针仍然在c++0x中定义,如果是这样,在哪里?

指出:

有重要的间接证据表明它仍然是明确的。

首先,§5.3.5/2中有两个句子说明

在第一种选择(delete对象)中,delete操作数的值可以是空指针值,…

在第二种选择(delete数组)中,delete操作数的值可以是空指针值或…

这些说明允许操作数为空,但它们本身并没有实际定义如果它为空会发生什么。

第二,改变delete 0的含义是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变。此外,在c++0x草案的兼容性附件(附件C)中也没有提到这是一个突破性的变化。然而,附件C是一个信息部分,因此它与标准的解释无关。

另一方面,如果删除空指针没有效果,则意味着需要进行额外的运行时检查。在许多代码中,操作数永远不可能为空,因此此运行时检查与零开销原则相冲突。也许委员会只是决定改变行为,使标准c++更符合语言的既定设计目标。

5.3.5/7说:

如果delete表达式的操作数的值不是空指针值,则delete表达式将调用释放函数(3.7.4.2)。否则,将不指定是否调用释放函数。

和3.7.4.2/3说:

提供给释放函数的第一个参数的值可以是空指针值;如果是,并且释放函数是标准库中提供的函数,则调用不起作用。

因此,只要使用标准的释放函数,或者用户提供的释放函数正确处理空指针,行为就定义得很好。

另一方面,如果需要删除空指针而不产生任何效果,则意味着需要进行额外的运行时检查。

新的措辞没有删除对空指针的运行时检查。另一种方式:标准草案甚至更接近于说实现必须使空指针测试兼容。

同样值得注意的是:旧标准自相矛盾,它说(5.3.5/2)"如果delete的操作数的值是空指针,则该操作没有效果",但后来又说(5.3.5/7)"delete表达式将调用一个释放函数"。调用函数是一种效果。当调用的函数很可能是重写的operator delete时,这一点尤其重要。

新的措辞消除了这种矛盾,明确地将在删除空指针的情况下是否调用释放函数留给实现。