c++ - 虚拟成员函数中的 `delete this` 是安全的吗?

标签 c++ memory-management

我已经知道某些形式的“自杀”是安全的(被认为是合法的),但是,在虚拟成员函数中执行 delete this 是否特别安全?

请注意,“安全”是指编译器生成的“代码”是否能够处理该构造。

注意,我对这样做的利弊不感兴趣,我只是考虑是否安全。

附带问题:语言标准是否明确或隐含地要求实现支持任何形式的delete this 习语?

我不认为这是 Is delete this allowed? 的拷贝.我的问题是在虚拟成员函数中这样做是否安全。

下面是我想做的事情的概述

class FooBase {
protected:
    virtual void on_idle() { /* no-op by default */ }
};

class Foo : public FooBase {
    void on_idle() override final
    {
        delete this;
    }
};

请注意,虽然 Foo 需要堆分配,但其他子类可能不需要。

最佳答案

是的,只要你之后不使用 this,其他人也不会使用指向 *thisthis 的指针> 保证由 new 分配,与您要删除它的类型完全相同,或者拥有一个虚拟析构函数。 (即,从不作为另一个对象的成员,在 std::vector 中,作为自动存储变量,作为静态变量,作为临时变量,而不是 new[],不是展示位置 new,等等等等)

这包括调用非虚拟方法、虚拟方法、成员访问、调用 dtor 以及无数其他事情;除了下一行的 return; 之外,几乎所有其他内容都在 delete this 之前被清除; (或确定性地永远不会被使用)。

作为一般规则,您必须对对象的生命周期进行控制,以确保 delete this; 安全,您可以将生命周期管理重构为外部 到类和智能资源所有者中,它可能将其状态保持为它删除的 pImpl崇拜值类型,以及 delete this; 永远不能被视为值的类型。

除了更高的继承倾向外,标准中没有任何内容让删除它;虚拟对象额外危险。

delete this; 的所有类型都应具有虚拟析构函数 final 以避免继承问题。

关于c++ - 虚拟成员函数中的 `delete this` 是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48085528/

相关文章:

scala - 在这些情况下,Scala 值类将为 "boxed",对吗?

c++ - 如何防止在 C++ 中无意中互换使用 delete 和 free?

c - 通过 remap_pfn_range 将保留的高端内存映射到用户空间

c++ - c++中的<climits>和<limits>头文件有什么区别?

c++ - 通过 C++ 中的构造函数将地址参数传递给基类指针

使用不同编译器的 C++ 和可变参数

c++ - 如何读取高度图值以生成地形?

java - 我们可以从 java 应用程序内部限制 java 应用程序的内存吗?

ctime() 返回一个字符串,为什么我们不需要 free() 这个字符串的内存?

c++ - 矩阵模式。稀疏行运算符*(矩阵, vector )