C++クラスメンバーの存続期間はどのくらいですか。たとえばstd::fstream
、Foo
オブジェクトのはいつリリースされますか?デストラクタに入るとき、またはデストラクタを出るとき?これはC++標準で定義されていますか?
struct Foo
{
std::fstream mystream;
~Foo()
{
// wait for thread writing to mystream
}
};
データメンバーは、の本体が実行された後、オブジェクトのmystream
破棄中に破棄されます。C++11§12.4[class.dtor]/8の状態:Foo
~Foo()
デストラクタの本体を実行し、本体内に割り当てられた自動オブジェクトを破棄した後、クラスのデストラクタは、の直接の非バリアント非静的データメンバーのデストラクタ、の直接の基本クラスの
X
デストラクタを呼び出します。最も派生したクラスのタイプであるそのデストラクタは、の仮想基本クラスのデストラクタを呼び出します。X
X
X
X
mystream
は、の非バリアント、非静的データメンバーですFoo
(バリアントデータメンバーはユニオンのメンバーです。ユニオンでFoo
はありません)。
それは構造の逆です:
構築:基本クラス、データメンバー(
mystream
ここで構築)、コンストラクター本体破壊:デストラクタ本体、データメンバー(
mystream
ここで破壊)、基本クラス