假设我有一个类,其构造函数产生一个删除对象的线程:
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
但是构造函数在几个方面都很特殊,所以我不确定这是否有效。
此外,如果它是非法的,我不知道如何解决它,其他在构造对象后必须调用的特殊初始化函数中产生线程,我真的想避免这种情况。
PS:我正在寻找 C++03 的答案(我仅限于该项目的旧编译器)。示例中的std::thread
仅用于说明目的。