删除C ++ 0x中的nullptr是否安全?

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

在任何一种情况下,如果delete的操作数的值是空指针,则操作不起作用。

但是,在目前的草案为c++0x这个句子似乎缺less。 在草稿的其余部分,我只能find句子,说明如果delete-expression的操作数不是空指针常量会发生什么情况。 是删除仍然在c++0x定义的空指针,如果是的话,在哪里?

笔记:

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

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

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

在第二种select(删除数组)中,删除操作数的值可能是空指针值或…

这些说操作数被允许为空,但它们自己并不真正定义如果是的话会发生什么。

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

另一方面,删除空指针需要不起作用意味着额外的运行时检查。 在许多代码中,操作数不能为空,所以这个运行时检查与零开销原则相冲突。 也许委员会只是决定改变行为,使标准的c + +更符合语言设定的目标。

5.3.5 / 7说:

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用一个释放函数(3.7.4.2)。 否则,未明确是否调用解除分配函数。

和3.7.4.2/3说:

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

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

另一方面,删除空指针需要不起作用意味着额外的运行时检查。

新的措辞不会删除运行时检查空指针。 相反,标准草案更接近于说一个实现必须使空指针testing合规。

还值得注意的是:旧标准自相矛盾,它说(5.3.5 / 2)“如果删除操作数的值是空指针操作没有效果”,但后来又说(5.3.5 / 7) “delete-expression将调用一个释放函数”。 调用一个函数是一个效果。 这是特别如此,因为被调用的函数可能是一个重载operator delete

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