2016-05-10 19 views
0

c++コードを使用して、exit(3)を呼び出してユーザーAPIを使用できます。私の前提は、スタックを適切に巻き戻していないことと、これがc++で悪いと考えていることです。また、ブラックボックスとみなされなければならない大きなライブc++が含まれています。不適切なスタック巻き戻しを観察するにはどうすればよいですか?

私はこれにパッチを当てたいと思っていますが、どのように考えているのですか?変更を観察し比較する方法はわかりません。これを何とか見えるようにすることはできますか?おそらくOS Xで?

+1

あなたの評価は正しいです:http://stackoverflow.com/questions/2668075/will-exit-or-an-スコープの終わりを除いた例外防止 - デストラクタ - から - 呼ばれる – Petesh

+1

に依存します。プロセスは終了しています。メモリを解放する必要はありません。カーネルオブジェクトは自動的に閉じられます。あなたのクリーンアップの多くは、行う必要はありません。しかし!ファイルハンドルがカーネルによって閉じられているからといって、ファイルへの最終的なデータフラッシュが行われたわけではありません。いくつかの外部リソースは、適切に閉じられていないことに敏感です。データベースは、接続を終了するだけではなく、クライアントが通知することを好みます。それは依存しています:環境に永続的な副作用が残っていない(ファイルのフラッシュ、ログ、クリーンなデータベースのクローズ)ことができない場合は、先に進んで終了してください。 – davidbak

答えて

1

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. 
関連する問題