13

この質問mainの多くの例で見られるように、が呼び出される前にコードを実行することは間違いなく可能です。

ただし、そのプリメイン コードで、プログラムがstd::exitorを介して終了するように指示された場合はどうなるstd::abortでしょうか。mainはプログラムの開始として定義されているため、開始前に終了するとどのような結果が生じるでしょうか?

各セクションで何かを印刷すると、次の結果が得られます。

フォーマット:
セクション:output

Main : main
Init (メインの前に呼び出される) : Exit ( Init 内init
で設定std::atexit) :exiting



サンプルラン:

終了せずに呼び出される初期化:

初期化
メイン
は 0 を返します

初期呼び出し std::exit(0):

初期化
は 0 を返します

初期呼び出し std::abort:

init
がクラッシュし、Windows で GCC 4.7.2 が
クラッシュして 3 が返される VS11 で通常のボックスが表示され、LiveWorkSpace
で 0 が返される

Init はハンドラを設定し、std::exit(0) を呼び出します:

初期化
終了
は 0 を返します

Init はハンドラを設定し、std::abort を呼び出します:

ハンドラー
なしと同じ取引を開始する

検索中に、次の質問を見つけました: main() の前に C/C++ プログラムがクラッシュする方法はありますか? . しかし、それは私が知りたいことには答えません:この動作、呼び出しstd::exitまたはstd::abortbeforemainは明確に定義されていますか この未定義の動作はありますか?

4

1 に答える 1

7

簡単に言えば、影響は (ほとんど) ありません。予期せず を呼び出すと、一部のデストラクタが呼び出されない場合がありますexitが、それで十分です。
一般に、デストラクタを呼び出さないことは可能な限りクリーンな方法ではありませんが、最終結果は同じになります。

プロセスが ( segfaulting またはその他の理由で) 終了すると、ハンドル (カーネル オブジェクト、ファイルなど) が閉じられ、プログラムのアドレス空間に関連付けられたメモリがオペレーティング システムによって再利用されますexitabort

exitまたはを呼び出すときはabort、基本的にプログラムの終了を要求しているため(これらの関数は決して返されません!)、その後は何も起こらないと本当に期待できないからです。

Init前に呼び出されるような関数を登録することmainは非標準的なものですが、グローバルにコンストラクターを持つことで同じ効果が得られることに注意してください。

于 2012-11-03T23:55:33.297 に答える