在c++0x中删除nullptr仍然安全吗?
Is it still safe to delete nullptr in c++0x?
在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
时,这一点尤其重要。
新的措辞消除了这种矛盾,明确地将在删除空指针的情况下是否调用释放函数留给实现。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 如何将元素添加到数组的线程安全函数?
- 将指针设置为"nullptr"并不能防止双重删除?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- c++:成员函数中的"this == nullptr"安全吗?
- 致电openssl beio/ec_key/evp_key/.._ nullptr上的免费功能是安全的吗?
- 将 nullptr 分配给 std::string 是安全的
- 将 nullptr 分配给函数指针变量是否安全
- 使用nullptr计算指针偏移是否安全?
- 在c++0x中删除nullptr仍然安全吗?