我已经知道某些形式的“自杀”是安全的(被认为是合法的),但是,在虚拟成员函数中执行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
,并且其他任何人都没有指向*this
的指针,并且this
保证由new
分配为您正在删除它或拥有虚拟析构函数的类型。 (即,永远不要作为另一个对象的成员,在std::vector
中,作为自动存储变量,作为静态变量,作为临时变量,而不是new[]
,而不是放置new
等等)
这包括调用非虚方法,虚方法,成员访问,调用dtors以及其他无数的东西;在return;
(或确定性地从未使用过)之前,几乎所有除*this
以外的任何东西以及某种其他指向delete this;
的指针都被清理干净了。
作为一般规则,您必须对对象生命周期进行控制的程度非常高,以使delete this;
安全,您可以将生命周期管理重构为类外部和智能资源所有者,这可能会保持其状态为它删除的pImpl
。 c++崇拜值类型,以及delete this;
永远不能被视为值的类型。
除了更高的继承倾向之外,标准中没有任何内容可以使delete this;
对virtual
对象更加危险。
所有类型的delete this;
都应该有虚拟析构函数或final
以避免继承问题。