【发布时间】:2013-02-07 15:00:41
【问题描述】:
我无法理解为 void* == nullptr 调用 operator delete 的标准需要做什么。
类似这样的:
void foo(void* ptr) // ptr == nullptr here
{
delete ptr;
}
一方面,我们在标准中有以下声明:
ISO/IEC 14882:2011
5.3.5 删除[expr.delete]
1 ... 操作数应具有指向对象类型或类类型的指针 具有指向指针的单个非显式转换函数(12.3.2) 对象类型。结果的类型为 void.78
78) 这意味着不能使用指针删除对象 输入 void* 因为 void 不是对象类型。
这使得删除 void* 的代码格式错误。另一方面,我们在 delete 中还有一个关于 nullptr 的声明:
ISO/IEC 14882:2011
5.3.5 删除[expr.delete]
2 ... 在第一个选择(删除对象)中, delete 的操作数可能是一个空指针值,一个指向 由先前的 new 表达式创建的非数组对象,或指向 表示此类对象的基类的子对象(1.8)(条款 10)。如果不是,则行为未定义。在第二种选择中 (delete array),delete的操作数的值可能为null 指针值 或由前一个数组产生的指针值 new-expression.79 如果不是,则行为未定义。
在这种情况下需要做什么实现?
【问题讨论】:
-
矛盾在哪里?你可以删除
NULL或非void *的东西。 -
@cnicutar 我在我的问题中添加了一个示例
-
nullptr的类型不是void*,而是std::nullptr_t,并且可以隐式转换为任何指针类型。这远非void*。
标签: c++