operator删除标准行为

时间:2013-02-22 04:04:00

标签: c++

我无法理解为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的操作数可以是空指针值,指向a的指针   由前一个new-expression创建的非数组对象,或指向的指针   表示这种对象的基类的子对象(1.8)(子句   10)。如果不是,则行为未定义。在第二种选择   (删除数组),删除操作数的值可以为null   指针值或由前一个数组产生的指针值   new-expression.79如果不是,则行为未定义。

在这种情况下需要做哪些实施?

1 个答案:

答案 0 :(得分:3)

Null和void*是两回事:

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

您给定的代码格式不正确,但它与指针的无关(可能为null),但其类型(其中)不能是void*)。