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

Man*_*rse 73 c++ null language-lawyer delete-operator

c++03它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2:

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

然而,在目前的草案对于c++0x这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x,如果是,在哪里?

笔记:

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

首先,有两句话§5.3.5/2说明

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

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

这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.

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

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

int*_*jay 90

5.3.5/7说:

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

并且3.7.4.2/3说:

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

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

  • [自C++ 14起](http://en.cppreference.com/w/cpp/language/delete)"如果表达式求值为空指针值,则不调用析构函数,并且不调用释放函数." (7认同)
  • @Wormer我不认为该页面是正确的.当指针为空(5.3.5/7)时,C++ 14标准仍然说"未指定是否将调用释放函数". (2认同)
  • 顺便说一句,为空文件指针调用 fclose() 是*不*的。在 Ubuntu(可能还有其他操作系统)上,fclose(NULL) 会导致分段错误。 (2认同)
  • 在我看来,@GerryBeauregard 这是一个 POSIX 文件函数,与 C++ 内存管理无关。关闭文件句柄具有完全不同的含义,因此我认为这种比较不适合或对本次讨论没有任何价值。 (2认同)

Dav*_*men 7

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

新的措辞不会删除空指针的运行时检查.反过来说:草案标准更接近于说实现必须使空指针测试符合要求.

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

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