2011-08-14 24 views
16

可能性の重複:C++で
Will exit() or an exception prevent an end-of-scope destructor from being called?exit()を呼び出すときにデストラクタが実行されますか?

アプリケーションが終了を呼び出したときに、(3)スタック上のデストラクタは、スタックをアンワインドするために実行されるようになっていますか?

+0

また、別の方法がありますか? 'exit'を呼び出すのではなく' main'でキャッチし、 'main'から' exit'の代わりに 'main'を' return'するのではなく、特別な型を '投げます'? –

+1

@AaronMcDaid私はあなたの質問を理解していません。何に代替のアプローチ?あなたは 'exit()'の呼び出しを避けることによって何を達成しようとしていますか?私のアプリケーションの1つでは、 'customExit'オブジェクトを投げてmainでキャッチし、' customExit'オブジェクトの整数値を使用してメインからの戻り値を供給します。この方法でRAIIデストラクタを実行して一時ファイル。 – WilliamKF

+0

あなたのコメントは私の(ひどく書かれた)質問に正確に答えました。ありがとう!基本的には、他の人がこの「スロー」アプローチを使用して、通常のプログラム出口ですべてが破壊されていることを確認することを確認したかった –

答えて

28

いいえ、多くのデストラクタはexit()で動作しません。

C++ 98§18.3/ 8ではこれについて説明しています。

exitと呼ばれ、静的オブジェクトが破壊されると、atexitハンドラが実行され、開いているCストリームがフラッシュされて閉じられ、tmpfileで作成されたファイルが削除されます。ローカル自動オブジェクトは破棄されません。つまり、スタックを巻き戻さない。

abortを呼び出すと、それ以上のことは起こりません。クリーンアップはまったくありません。

+0

クリーンアップをしたくない人にとっては、abort()はSIGABRTシグナルを発生させるので、_exit()はabort()よりも優れた呼び出しになる可能性があります。 –

5

OSが合理的(Unix、Linux、または最近のWindows)の場合、exit()を呼び出すと、すべてのプロセスのメモリの割り当てを解除するようにカーネルに指示します。スタックを解く必要はありません。それは単に存在しなくなります。

+13

そして、スタックデストラクタのRAIIコードは呼び出されません。そのプロセスに専用のメモリだけを扱うかどうかは関係ありません。 (a)削除または名前の変更が必要なファイル、または他の方法でクリーンアップされたファイル、および(b)共有メモリ内のプロセス間で共有されるデータ構造の完全性を処理する場合に重要です。 //これらの理由から、いくつかのプロジェクトではexitの使用を禁止したり、スタックの巻き戻しを引き起こす例外をスローするためにexit()を再定義したりしています。 –

関連する問題