在函数中删除`的行为

时间:2015-10-14 07:37:10

标签: c++

假设我有一个foo课,其函数release调用delete this

struct foo
{
    std::int32_t release() const
    {
        delete this;
        return 0;
    }
};
  1. 为什么我可以调用delete this,因为函数是const

  2. 是否定义了返回0的行为? delete

  3. 之后的功能是“排序”吗?

    引用该标准的答案(因此我可以在我的代码中加上精彩的评论)将非常感激。

2 个答案:

答案 0 :(得分:1)

  

为什么我甚至可以调用delete,因为函数是const

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

  

是否定义了返回0的行为?删除后不是“排序”功能吗?

为什么会这样?逻辑未从程序中删除。该功能保留在内存中,供下一个对象使用。它只有this指针才会失效。

有一个SO answer指向The ISO C++ FAQ,其上有一个条目,摘录于:{/ p>

  
      
  1. 您必须绝对100%确定您的其他成员函数(在删除此行之后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员)。这包括将在析构函数中运行的代码,用于堆栈中分配的任何仍然存活的对象。
  2.   
  3. 你必须绝对100%肯定在删除此行后没有人甚至触及此指针本身。换句话说,你不能检查它,将它与另一个指针进行比较,将它与nullptr进行比较,打印,投射,用它做任何事情。
  4.   

由于你的代码遵守这些规则,再次,没关系。

答案 1 :(得分:1)

  
      
  1. 为什么我甚至可以调用delete,因为函数是const?
  2.   

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

  

[注意:指向const类型的指针可以是a的操作数   删除表达;没有必要抛弃常量   (5.2.11)之前的指针表达式用作操作数   delete-expression。 - 后注]

  
      
  1. 是否定义了返回0的行为?
  2.   

我认为这很安全。 delete this;将调用析构函数并释放对象的内存保留(包括成员变量和基类子对象)。之后,如果你没有拒绝this,或访问任何成员变量,它将是安全的。