21

次のコードがあるとします。

struct mytype
{
    ~mytype() { /* do something like call Mix_CloseAudio etc */ }
};

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}

exit() が start() 内のどこかから使用された場合でも、そのデストラクタが呼び出されることが保証されていますか?

4

3 に答える 3

25

を呼び出すexitと、デストラクタは呼び出されません。

C++ 標準 (§3.6.1/4) から:

関数の呼び出し

void exit(int);

(18.3)で宣言され<cstdlib>ていると、現在のブロックを離れることなくプログラムが終了するため、自動保存期間 (12.4) を持つオブジェクトを破棄することはありません。静的ストレージ期間を持つオブジェクトの破棄中にプログラムを終了するために exit が呼び出された場合、プログラムは未定義の動作をします。

于 2010-04-19T14:20:12.587 に答える
17

はい、 exit() を呼び出すと、デストラクタが呼び出されないことを意味します。

関数 void exit(int); の呼び出し (18.3)で宣言され<cstdlib>ていると、現在のブロックを離れることなくプログラムが終了するため、自動保存期間 (12.4) を持つオブジェクトを破棄することはありません。静的ストレージ期間を持つオブジェクトの破棄中にプログラムを終了するために exit が呼び出された場合、プログラムは未定義の動作をします。

一方、例外がスローされた場合は、デストラクタが呼び出されます。これは、C++ における例外安全性の基礎です。

于 2010-04-19T14:20:18.397 に答える
3

プログラム内の何かが例外をキャッチする限り、例外はデストラクタを呼び出します。例外が捕捉されずに main() 関数を終了した場合、標準では、ランタイムがスタックをアンワインドしてクリーンアップする必要はありません。

を使って

try{
  // code
}catch(...){ //that elipsis should actually appear in your code
             //it doesn't mean I omitted code here.
  //code
}

main()関数内では、すべての例外がキャッチされ、すべてのデストラクタが呼び出されることが保証されます。

于 2010-04-19T14:24:14.503 に答える