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

时间:2011-07-18 10:09:08

标签: c++ null language-lawyer delete-operator

c++03中,很明显删除空指针无效。实际上,§5.3.5/2明确指出:

  

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

然而,在当前c++0x c++0x中,这句话似乎不见了。在草稿的其余部分,我只能找到句子,说明如果 delete-expression 的操作数不是空指针常量会发生什么。是否删除§5.3.5/2中仍然定义的空指针,如果是,那么?

备注:

有大量的间接证据表明它仍然有明确的定义。

首先,delete 0中有两句话说明

  

在第一个替代(删除对象)中,delete操作数的值可能是空指针值,...

  

在第二个备选(删除数组)中,delete操作数的值可能是空指针值或...

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

其次,改变c++0x的含义是一个重大的突破性变化,标准委员会不太可能做出这一特定的改变。此外,没有提到这是{{1}}草案的兼容性附件(附件C)中的重大变化。然而,附件C是一个信息性部分,因此对标准没有任何解释。

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

2 个答案:

答案 0 :(得分:82)

5.3.5 / 7说:

  

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用释放函数(3.7.4.2)。否则,是否未调用是否将调用释放函数。

并且3.7.4.2/3说:

  

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

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

答案 1 :(得分:5)

  

另一方面,删除空指针要求无效的事实意味着额外的运行时检查。

新措辞不会删除对空指针的运行时检查。另一种方式:草案标准更接近于说实现必须使空指针测试符合要求。

同样值得注意的是:旧标准自相矛盾,因为它说(5.3.5 / 2)“如果删除操作数的值是空指针,则操作无效”但后来又说(5.3.5) / 7)“delete-expression将调用deallocation函数。”调用函数是一种效果。特别是这样,因为被调用的函数可能被覆盖operator delete

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