1

我无法理解为 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 的操作数的值可能是空指针值或前一个数组 new-expression 产生的指针值。79 如果不是,则行为未定义。

在这种情况下需要做什么实施?

4

1 回答 1

3

Null 和void*是两个不同的东西:

delete static_cast<int*>(nullptr); // deleting null pointer, of int*

您给定的代码格式错误,但它与指针的值(可能为 null)无关,而是与指针的类型(不能为void*)无关。

于 2013-02-22T04:10:17.960 回答