函数中' delete this '的行为

Behaviour of `delete this` in a function

本文关键字:this 函数 delete      更新时间:2023-10-16

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

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

  2. 返回0时的行为是否已定义?函数"sort-of-die"是不是在delete之后?

一个参考标准的答案(这样我就可以在我的代码中添加一个花哨的注释)将不胜感激。

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

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

[注:指向const类型的指针可以是a的操作数delete-expression;没有必要抛弃这种不变(5.2.11)在将指针表达式用作操作数之前对其进行操作delete-expression。-end note]

  • 返回0时的行为是否已定义?
  • 我认为它是安全的。delete this;将调用析构函数并释放对象(包括成员变量和基类子对象)持有的内存。在此之后,如果您不解引用this,或访问任何成员变量,它将是安全的。

    既然函数是const

    ,为什么还要调用delete this呢?

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

    返回0的行为是否已定义?在删除之后,函数不是"有点死"了吗?

    为什么呢?逻辑并没有从程序中移除。该功能保留在内存中,以供下一个对象使用。只有this指针失效。

    有一个SO答案指向ISO c++常见问题解答,其中有一个条目,其中的摘录:

  • 你必须绝对100%地肯定你的成员函数的其余部分(删除这一行之后)不会触及这个对象的任何部分(包括调用任何其他成员函数或触及任何数据成员)。这包括将在析构函数中运行的代码,这些析构函数用于堆栈上分配的任何仍然存活的对象。
  • 你必须绝对100%肯定地确保在删除这一行之后没有人碰过this指针本身。换句话说,你不能检查它,不能和另一个指针比较,不能和nullptr比较,不能打印它,不能强制转换它,不能对它做任何操作。