私はさまざまなサイトを見回しましたが、この質問に対する答えは見つかりませんでした。タイトルが示すように、作業中のライブラリがクラッシュした場合にキャッチする方法を見つけようとしています。ライブラリにある多くのマネージャ スタイル クラスのインスタンスを保持する Root クラスがあり、デストラクタでインスタンスを解放します。当然のことながら、マネージャーはかなりの量のデータを担当しているため、データを適切に破棄しないと、かなり許容できない、さらには危険なレベルのメモリ リークが発生する可能性があります。
プログラムがクラッシュすると、OS がプログラムのスタック領域の割り当てを解除することは承知していますが、割り当てられたオブジェクトのデストラクタの呼び出しは含まれません。また、実行中に割り当てられたヒープを削除することも含まれていません。これは、ライブラリ内の大量のメモリを処理する方法であり、広範なメモリ リークの問題に戻ります。
私が他のサイトで見つけた多くの回答は、関数を に登録するように言っているだけatexit()
ですが、アプリケーションがクラッシュした場合、その関数は機能しません。そして、前述のように、クラッシュはデストラクタを呼び出さないため、破棄されたときにすべてを閉じるグローバル シングルトンを作成する方法はありません。私のもう 1 つの考えは、ライブラリのエンド ユーザーが適切な予防策を講じてクラッシュを回避することを期待することでした (例外スローの広範な使用を通じて)。それに対処するためにエンドユーザーに少し多くのことを求めています。
TL;DR の質問は次のとおりです。標準の C++ 関数または何らかのマネージャー クラスを使用して、ライブラリがクラッシュしたときにそれをキャッチして適切に処理する方法はありますか?
編集:また、これに対処するには、クロスプラットフォームの方法を本当に好みます。私のコード ベースは C++11 の機能を多用しているため、使用可能なコンパイラを GCC と Clang の最新バージョンにプログラムで制限しました。
それだけでなく、ファイル システムへのストリームを閉じて、終了ステータスに関するいくつかのメッセージを出力する Logger などのクラスもいくつかあります。ファイルへのメモリリークの可能性を報告するメモリトラッカーもありますが、デストラクタでのみです。