【问题标题】:operator delete standard behavior操作员删除标准行为
【发布时间】: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++


【解决方案1】:

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

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

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

【讨论】:

  • 查看我的问题中的示例
  • @NikitaTrophimov:见过。我看不出矛盾在哪里。这是两个单独的子句是有原因的,第一个明确谈论void*,而第二个一般指delete
  • @NikitaTrophimov:void * 是指针 type。而NULL 是指针的。它们是有区别的。简单地说,允许有一个值为NULL的指针,前提是指针不是类型void *
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2016-09-24
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多