コンストラクターがオブジェクトを削除するスレッドを生成するクラスがあるとします。
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
は、説明を目的としたものです。