exit()
明らかにクリーンアップを行います。これは標準のセクション18.5 [support.start.term]で説明されていますが、頻繁に正しいサイトwww.cplusplus.comが要約しています。
静的ストレージまたはスレッドストレージのオブジェクトは、I/Oシステム全体(ファイルがフラッシュされるなど)と同様にクリーンアップされます。
しかし、を終了するには、をC++クリーンアップなしで終了する方法があります。たとえば、ライブラリで、exit
が呼び出され、C言語ライブラリ(C++ではなく)である場合、C++クリーンアップが行われる場合とされない場合があります。またはabort
またはquick_exit
への呼び出しがあります。また、OSを直接呼び出すと(Windowsの場合はExitProcess()
)、プロセスはすぐに終了し、にはのC++クリーンアップが行われます。
ビヘイビアを表示したい場合:メッセージをどこかに記録するなど、面白いことをするデストラクタを持つオブジェクトを作成します。あるいは、それが構築されたときに、特定の名前のファイルを作成し、破壊されたときにそれを削除します。 main()
にこのオブジェクトのインスタンスを宣言します。静的なスコープで別のメッセージを(別のメッセージで)宣言します。これで、あなたの環境で観測可能な効果が得られました。
次は、N4140(2014年10月7日)の18.5からです:
[[noreturn]] void exit(int status)
8 The function exit() has additional behavior in this International Standard:
(8.1) First, objects with thread storage duration and associated with the current
thread are destroyed. Next,objects with static storage duration are destroyed
and functions registered by calling `atexit` are called. See 3.6.3 for the
order of destructions and calls. (Automatic objects are not destroyed as a
result of calling `exit()`.) If control leaves a registered function called by
`exit` because the function does not provide a handler for a thrown exception,
`std::terminate()` shall be called (15.5.1).
(8.2) Next, all open C streams (as mediated by the function signatures declared in
`<cstdio>`) with unwritten buffered data are flushed, all open C streams are
closed, and all files created by calling `tmpfile()` are removed.
(8.3) Finally, control is returned to the host environment. If `status` is zero or
`EXIT_SUCCESS`, an implementation-defined form of the status _successful
termination_ is returned. If `status` is `EXIT_FAILURE`, an implementation-
defined form of the status _unsuccessful termination_ is returned. Otherwise
the status returned is implementation-defined.
あなたの評価は正しいです:http://stackoverflow.com/questions/2668075/will-exit-or-an-スコープの終わりを除いた例外防止 - デストラクタ - から - 呼ばれる – Petesh
に依存します。プロセスは終了しています。メモリを解放する必要はありません。カーネルオブジェクトは自動的に閉じられます。あなたのクリーンアップの多くは、行う必要はありません。しかし!ファイルハンドルがカーネルによって閉じられているからといって、ファイルへの最終的なデータフラッシュが行われたわけではありません。いくつかの外部リソースは、適切に閉じられていないことに敏感です。データベースは、接続を終了するだけではなく、クライアントが通知することを好みます。それは依存しています:環境に永続的な副作用が残っていない(ファイルのフラッシュ、ログ、クリーンなデータベースのクローズ)ことができない場合は、先に進んで終了してください。 – davidbak