class foo {
public:
foo()
: // initialize other data-members
, t(std::bind(&foo::self_destruct, this))
{}
private:
// other data-members
std::thread t;
// no more data-members declared after this
void self_destruct() {
// do some work, possibly involving other data-members
delete this;
}
};
问题在于,在构造函数完成之前可能会调用析构函数。在这种情况下,这是合法的吗?由于变量
t
是最后声明(并因此初始化)的,并且构造函数体中没有代码,而且我从不打算子类化此类,因此当调用 self_destruct
时,我假设对象已经完全初始化。这个假设正确吗?我知道如果在成员函数中使用了
delete this;
语句,并且在该语句之后未再使用 this
,那么这是合法的。但是构造函数在多个方面都是特殊的,所以我不确定这是否有效。此外,如果这是不合法的,我不确定如何解决它,除了在特殊的初始化函数中生成线程,该函数必须在对象构造后调用,但我真的想避免这样做。
附言:我正在寻找 C++03 的答案(此项目受到较旧编译器的限制)。此示例中的
std::thread
仅用于说明目的。
t
的构造函数完全执行之前,你可能会调用它的析构函数。这肯定是未定义行为。 - mfontaninifoo
,该函数创建一个shared_ptr<foo>
,你可以将其交给线程?(使用 shared_from_this 会更好,但那不是一个选项) - user786653delete this;
,因为您之后不会访问任何数据成员,但是您无法“欺骗”第三方类对象(std::thread
)像那样销毁自己,并期望事情表现良好。 - Mikael Persson