2015-10-14 24 views
2

假设`删除this`我有一个类foo与函数release调用delete this行为的功能

struct foo 
{ 
    std::int32_t release() const 
    { 
     delete this; 
     return 0; 
    } 
}; 
  1. 为什么我连电话delete this鉴于该功能是const

  2. 是否定义了返回0行为? delete之后的功能是否“排序”?

引用标准的答案(所以我可以在我的代码中插入一个奇特的评论)将不胜感激。

+2

早晨Slodge:一次我不能回答你的问题。我认为这是安全的,因为我在不久前编写了代码,我仍然享受全职工作! 1.删​​除不是真的修改一个对象,它是抛出一个对象失去存在,2.认为成员函数不过是一个额外的(虽然隐藏)'this'参数的静态。只要你在删除对象后不提及'this',你就会好的。 PS是*我们的*代码。 – Bathsheba

+1

这是在[C++ FAQ](https://isocpp.org/wiki/faq/freestore-mgmt#delete-this)中的一个条目。 – TartanLlama

+0

它用于COM风格的引用计数。 –

回答

1

为什么我连电话删除此给出该函数是常量

因为delete不一定修改删除的指针。

是否定义了返回0行为?删除后不能使用“sort-of-die”功能吗?

为什么会这样?该逻辑不会从程序中删除。该功能保留在内存中供下一个对象使用。它只是this指针被取消。

有一个SO answer指向The ISO C++ FAQ这对一个条目,摘录其中:

  • 你必须100%正面肯定的休息你成员函数(删除该行后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员)。这包括将在堆栈中分配的任何对象在析构函数中运行的代码,这些对象仍处于活动状态。
  • 你肯定绝对100%肯定没有人甚至在删除这行后触及这个指针本身。换句话说,您不能检查它,将它与另一个指针进行比较,将它与nullptr进行比较,将其打印出来,进行转换,对其执行任何操作。
  • 由于您的代码遵守这些规则,所以没关系。

    +1

    “它通过值(void *)获取指针,任何T *都可以被转换。” - 这是不正确的,'delete'操作符处理* typed *指针,否则它不能调用析构函数。你所指的是'operator delete'功能。 – TheOperator

    1
    1. 为什么我甚至可以在给定函数为const的情况下调用delete?

    从标准,5.3.5 $ 2删除[expr.delete]

    [注:一个指针一个const类型可以是 删除表达式的操作数;在它被用作 delete-expression的操作数之前,没有必要丢弃指针表达式的常量 (5.2.11)。末端音符]

  • 被限定在返回0的行为?
  • 我认为这是安全的。 delete this;将调用析构函数并释放由对象保存的内存(包括成员变量和基类子对象)。在那之后,如果你不去解析,或者访问任何成员变量,它将是安全的。

    +0

    加上1/2到目前为止。 –