2011-01-15 23 views
7

一部の書籍では、クラス内のデータメンバーの破棄順序が、その構築順序の逆の順序でなければならないことがわかります。このルールの理由は何ですか?すべての例が評価されます。なぜデータメンバーの破壊の順序は重要ですか?

+3

これは推奨されている方法ではありませんが、実際の記述は簡単です:http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2 – mkb

答えて

12

これは、大部分において一貫性のためです。複数のオブジェクトが順番に作成されると、それらは常に逆の順序で破棄されます。たとえば、自動変数で、次の例を考えてみます。ここでは

{ 
    A a; 
    B b(a); 
} // b.~B() is called, then 
    // a.~A() is called 

は、baを使用しています。オブジェクトが構築の逆の順序で破棄されることを保証することによって、C++はオブジェクトの生涯管理をより多くより容易にします。

クラスでは、別のデータメンバーを初期化するときに、あるデータメンバーへの参照を渡すことができます。オブジェクトが逆の順序で破壊され、あなたは自動変数と同じ動作を得ることを確認:

struct S 
{ 
    A a; 
    B b; 

    S() : a(), b(a) { } 
}; 

注それは、相互に参照するデータメンバを持っていることは通常は良い考えではないが、それが可能とたまに便利な両方だと。

+1

おそらく、オブジェクトBの後ろにオブジェクトBが現れるとき、BはAへの参照を保持することができます。逆は真ではないので、逆順(B、A)の破壊は意味をなさないが、最初にAを破壊するとBそれを参照することができます。 – EmeryBerger

+0

@EmeryBergerそうですが、直接メンバーの参照は構築時に初期化する必要があるためです。しかし、参照は唯一の '参照'の形ではありません。メンバーは互いにポインタを保持することが自由であり、いつでも設定することができ、順序が乱れて無効になることは自由です。さらに、メンバーが 'std :: vector'のような動的コンテナのメンバである場合、メンバは互いに '真の'参照を順序どおりに保持することができません。だから、本当に「できない」か「できない」ということはありません。ちょうど_should_と_できないはずです。参照の形式に関係なく、生涯について適切に考えることは不可欠です –

5

私は多分あなたが誤解したと思います。そのメンバーではないはこの順序で破壊されるべきであるが、それらはと指定されているです。

まれに、アイテムが破棄される順序を知ることが重要です。

いずれにせよ、それはオブジェクトが破壊される順序です。あなたはそれについて何もできませんが、起こっていることを知っています。

2

C++のライフタイムは可能な限り入れ子になっています。通常、まれにデータメンバーが互いに依存したり(例えば、あるもののポインタを渡すなど)、間接的に(たとえ両方がグローバルに依存し、stderrに出力を書き込むように)可能ですが、指定された順序を持つといいですし、他の順序よりも他の言語がどのように機能するか(例えば、関数スコープでの存続時間)は入れ子のほうが適しています。

もちろん、標準の "as-if"ルールの後で、コンパイラ/実装がユーザコードを決定できれば、破壊リオーダリングを見ることができないので、好きなように行うことができます。

関連する問題