私は別のチームによってCで書かれたライブラリを使用するC++アプリケーションに取り組んでいます。ライブラリの作成者は、exit()
エラーが発生したときに呼び出すことを好みます。これにより、C++アプリケーションのスタック上のオブジェクトのデストラクタを呼び出さずにプログラムがすぐに終了します。アプリケーションは、プロセスの終了後にオペレーティングシステムによって自動的に再利用されない一部のシステムリソース(共有メモリ領域、プロセス間ミューテックスなど)を設定するため、これは問題です。
アプリとライブラリの両方の完全なソースコードを持っていますが、ライブラリは非常に確立されており、単体テストがないため、変更するのは大変です。exit()
アプリの正常なシャットダウンを実装できるように 、呼び出しを「フック」する方法はありますか?
私が検討している1つの可能性は、アプリケーションである1つの大きなクラスを作成することです。つまり、すべてのクリーンアップは、そのデストラクタまたはそのメンバーの1つのデストラクタで行われます。次に、これらの大きなオブジェクトの1つをヒープに割り当てmain()
、グローバルを設定します。それを指すポインタ、およびatexit()
グローバルポインタを介してオブジェクトを削除するだけのハンドラを登録するために使用します。それはうまくいく可能性がありますか?
この問題に取り組むための既知の良い方法はありますか?