3
#include <iostream>
#include <exception>
using std::cout;
using std::endl;
class test
{
 public:
    test()
    {
        cout<<"constructor called"<<endl;
    }
    ~test()
    {
        cout<<"destructor called"<<endl;
    }
    void fun(int x)
    {
       throw x;
    }
};

int main()
{
    try
    {
        static test k;          
        k.fun(3);
    }
    catch(int k)
    {
        cout<<"exception handler"<<endl;
    }
}

例外がスローされると、スタックの巻き戻しプロセス中に、静的オブジェクトやヒープ オブジェクトではなく、ローカル オブジェクトのみが破棄されると思います。これが本当なら、クラス (テスト) デストラクタが呼び出される理由がわかりません。ありがとう。

4

3 に答える 3

4

テストデストラクタは、メインが終了した後に呼び出されます。

    catch(int k)
    {
        cout<<"exception handler"<<endl;
    }
    // Added this line
    std::cout << "Main Exiting\n";
}

現在テスト中

> g++ test.cpp
> ./a.out
constructor called
exception handler
Main Exiting
destructor called

静的(静的ストレージ期間オブジェクト)は、メインの終了後に作成の逆の順序で破棄されます。

于 2011-06-20T21:54:51.653 に答える
0

プログラムが終了しているため、デストラクタが呼び出されます。自動保存期間のオブジェクト(スタックオブジェクトやヒープオブジェクトではない)のみが破棄されます。

于 2011-06-20T21:55:15.573 に答える
0

このコードを実行すると、出力が得られます

constructor called
exception handler
destructor called

これは理にかなっています。静的オブジェクトのコンストラクターがtest最初に呼び出されます。例外がスローされると、例外ハンドラーによってキャッチされ、メッセージが出力されます。最後に、プログラムが終了すると、静的testオブジェクトのデストラクタが呼び出されます。

例外は、例外が実際にどこかでキャッチされたと仮定して、自動期間を持つ変数(つまりローカル)の存続期間のみを終了させます。例外は動的期間のオブジェクト(つまり、で割り当てられたもの)を破棄しませんnewが、動的に割り当てられたオブジェクトのコンストラクターで例外が発生した場合、メモリを元に戻す方法がないため、メモリが再利用されます。同様に、staticオブジェクトはプログラム全体で存続することになっているため、破棄されません。それらがクリーンアップされた場合、それらのオブジェクトへの参照がプログラムに渡された場合、問題が発生する可能性があります。

お役に立てれば!

于 2011-06-20T21:58:04.883 に答える