パフォーマンスが重要なダイナミックリンクライブラリ(DLL)に取り組んでいますが、これも比較的小さいバイナリサイズである必要があります。明示的に例外をスローしないので、例外サポートを完全に無効にしたいと思います。ただし、例外が1つあります(意図しないしゃれ)。メモリが不足すると(OOM)、アプリケーションにエラーコードを報告して、適切に処理できるようにする必要があります。コードベースが大きすぎるため、すべての割り当てを個別にチェックしてエラーを伝播できず、触れてはいけない外部コードが含まれています。そこで、DLLのエクスポートされた関数でOOM例外をキャッチしたいと思います。
簡単なテストでは、Visual C ++2010でC++例外を無効にした場合(つまり、/ EHa、/ EHsc、または/ EHsフラグがない場合)、割り当てが多すぎると、catch(std :: bad_alloc&)ブロックにジャンプすることが示されています。
したがって、希望どおりに機能するようです。ただし、次のレベル1の警告が表示されます:「C4530:C ++例外ハンドラーが使用されていますが、アンワインドセマンティクスが有効になっていません。/EHscを指定してください」。MSDNによると、「スローを実行する関数とスローをキャッチする関数の間のフレームに自動ストレージがあるオブジェクトは破棄されません」。
正確に私はここで何を失うでしょうか?ライブラリを介して作成されたものを削除でき、アプリケーションを最初からやり直すことができる限り、未定義の状態のままにしておくことは問題ありません(必要に応じて)。回復できないメモリリークの大きなリスクはありますか?
DLLは別のメモリプールを使用しますか?もしそうなら、アプリケーションにDLLをアンロードせずにパージできますか?アプリケーションが再初期化を実行するまで、ライブラリにそれ以上の(エクスポートされた)関数呼び出しを簡単に無視させることができます。
アドバイスありがとうございます。