1

そのため、ブロック\プログラムの最後で、コンパイラは定義されたオブジェクトのデストラクタを独自に呼び出します。デストラクタが呼び出される特定の順序はありますか?

class Foo1{
public:
~Foo1 () {cout << "Foo1 DTOR" << endl;}
};
class Foo2{
public:
~Foo2 () {cout << "Foo2 DTOR" << endl;}
};
void main(){
Foo1 A;
Foo2 B;
}

このプログラムを実行すると、次の出力が得られました。

Foo2 DTOR

Foo1 DTOR

最後に定義されたオブジェクトから始まり、最初のオブジェクトで終わるのは常にどのように機能するのでしょうか? または、この動作は予測できず、私の出力はこの状況に特有のものですか?

4

2 に答える 2

3

デストラクタは常にコンストラクタとは逆の順序で実行されます (プログラマが明示的にメモリ内のオブジェクトを削除する動的メモリを除く (そのデストラクタを呼び出して))。

あなたの例では、AはBの前にあるため、以前に呼び出されたコンストラクターです。そのため、デストラクタは B のデストラクタの後に呼び出されました。

于 2013-06-21T15:18:32.487 に答える
1

オブジェクトのライフタイムの LIFO 順序付けだけが理にかなっています。次の適度に代表的な例を考えてみましょう。

struct ValueHolder
{
    int value;
    ValueHolder() : value(0) { }
    ~ValueHolder() { std::cout << "Value = " << value << "\n"; }
};

struct HolderGuard
{
    ValueHolder & h;
    HolderGuard(ValueHolder & vh) : vh(h) { }
    ~HolderGuard() { ++h.value; }
};

使用法:

int main()
{
    ValueHolder h;
    HolderGuard(h);
}

これにより、最初に保持された値がインクリメントされ、次に出力されます。後のものが最初に破壊されなければ、後のものが以前のものに依存することは不可能です。

(例の構成の優れた点は、後のコードで例外がスローされた場合でも正しいことを行うことです。)

于 2013-06-21T15:47:31.857 に答える