C++ 函数中“delete this”的行为

C++ 函数中“delete this”的行为,c++,C++,假设我有一个类foo,它有一个函数release,调用delete this: struct foo { std::int32_t release() const { delete this; return 0; } }; 既然函数是const,为什么我甚至可以调用删除此 是否定义了返回0时的行为?删除后的函数“sort of die”不是吗 如果您能给出一个参考标准的答案(这样我就可以在代码中添加一条奇特的注释),我们将不胜感激 既然函

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

struct foo
{
    std::int32_t release() const
    {
        delete this;
        return 0;
    }
};
  • 既然函数是
    const
    ,为什么我甚至可以调用
    删除此

  • 是否定义了返回0时的行为?
    删除后的函数“sort of die”不是吗

  • 如果您能给出一个参考标准的答案(这样我就可以在代码中添加一条奇特的注释),我们将不胜感激

    既然函数是const,为什么还要调用delete this呢

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

    是否定义了返回0时的行为?删除后的函数“sort of die”不是吗

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

    这里有一个点,它有一个条目,摘录如下:

  • 您必须绝对100%肯定地确保成员函数的其余部分(删除此行后)不会触及此对象的任何部分(包括调用任何其他成员函数或触及任何数据成员)。这包括将在析构函数中为堆栈上仍处于活动状态的任何对象运行的代码
  • 您必须绝对100%肯定,在删除此行之后,甚至没有人触摸到此指针本身。换句话说,您不能检查它、将它与另一个指针进行比较、将它与nullptr进行比较、打印它、强制转换它、对它执行任何操作
  • 既然你的代码遵守这些规则,那也没关系

  • 既然函数是const,为什么还要调用delete
  • 从标准中删除5.3.5$2[expr.Delete]

    [注意:指向常量类型的指针可以是 删除表达式;不必丢弃常量 指针表达式的(5.2.11),然后将其用作 删除表达式。-结束注释]

  • 是否定义了返回0时的行为

  • 我认为它是安全的<代码>删除此项
    将调用析构函数并释放对象(包括成员变量和基类子对象)持有的内存。在那之后,如果你不解除这个,或者访问任何成员变量,它就安全了。

    早上的斯洛奇:这一次我不能回答你的问题。我认为这是安全的,因为我很久以前写的代码,我仍然享受全职工作!1.删除并不是真的修改一个对象,而是将一个对象炸得不存在。将成员函数视为只包含一个额外(尽管是隐藏的)
    参数的静态函数。只要删除对象后不引用
    ,就可以了。PS这是我们的代码。这是中的一个条目。它用于COM样式的引用计数。请参阅将函数限定为常量是一个错误。您可以通过const引用传递对象,任何人都可以释放。我不想调试这段代码。“它按值获取指针(void*),任何T*都可以转换为它。”--这不是真的,
    delete
    操作符对键入的指针起作用,否则它无法调用析构函数。您指的是功能
    操作员删除