3

次のような状況があります。

クラス B のスタック メンバー オブジェクトを含むクラス A があります。

Class A{
    B b;
}

B オブジェクトを使用して、A の初期化と破棄の動作を再定義しています。

Class B{
    B(){cout<<"taken care of some specific context initialization"<<endl;}
    ~B(){cout<<"cleaning the context initialization done before"<<endl;}
}

b が破棄されたときに ~B() が呼び出されているため、これはこれまでのところ機能しています (A デストラクタの後に行われると思います)。

これは私が探している動作ですが、コンパイラが次のように言う可能性が怖いです。私はそれが起こるべきだと思いますが、どのコンパイラでも可能ですか? というか、Aが滅びるまで待たなければならないというのが基準なのか?

前もって感謝します

4

1 に答える 1

2

C++ は as-if 動作に従います。つまり、理論的には、プログラムの動作が影響を受けない限り、bが破棄される可能性があります。影響を受けなければ、いつ破壊されても問題ありません。

ただし、実際には、所有者インスタンスbのデストラクタが破棄された直後に破棄されます。A

以下によって保証されます。

12.4 デストラクタ [class.dtor]

8)デストラクタの本体を実行し、本体内に割り当てられた自動オブジェクトを破棄した後、クラス X のデストラクタは、X の直接の非バリアント非静的データ メンバーのデストラクタ、X の直接基底クラスのデストラクタを呼び出します。最も派生したクラス (12.6.2) の型であり、そのデストラクタは X の仮想基本クラスのデストラクタを呼び出します。[...] (私の強調)

これが起こっているかのように動作する観察可能な動作を持つ実装は、依然として標準に準拠していることに注意してください。あなたの特定のケースでは、デストラクタに IO 操作があるため、この動作が実際に行われることが保証されています。

于 2012-11-08T09:08:01.083 に答える