0

When some local varibles go out of scope, stack unwinding occurs.

Exactly how destructors are called?

I want to know the mechanism through which compiler is able to call destructors of the objects that are on stack and not of the objects that are on heap.

4

2 に答える 2

3

デストラクタ呼び出しは、生成されたコードでコンパイラによって発行されます。

例えば、

void foo() {
    A a;
}

コンパイルすると:

void foo() {
    A::A(<stack-address-of-a>);
    A::~A(<stack-address-of-a>);
}

関数が早期に戻ると、少し複雑になります。検討

void foo(int i) {
    A a;
    if (i) return;
    B b;
}

のようなものとして

void foo() {
    A::A(<stack-address-of-a>);
    B::B(<stack-address-of-b>);
    if (i) goto destroy_a;
    B::~B(<stack-address-of-b>);
destroy_a:
    A::~A(<stack-address-of-a>);
}

例外はもう少し複雑です。通常の解決策には、必要なデストラクタ呼び出しをコール スタックに関連付ける例外領域と範囲が含まれます。概要については、LLVM での例外処理を参照してください。

于 2012-08-20T09:17:18.817 に答える
1

スタック(FILO)なのでデストラクタが逆順に呼び出されています。そのため、最後に作成されたオブジェクトが最初に破棄されます。

スタック上にあるオブジェクトのデストラクタをコンパイラが呼び出すメカニズムを知りたい

スタックに何かを入れる場合、スタックからポップする方法を知っている必要があります。これは理にかなっているようです...呼び出しはコンパイルプロセスで追加されます。

于 2012-08-20T09:17:27.357 に答える