私は共有ライブラリから少しの量のメモリをリークする関数を使用する必要があります(ライブラリを変更できないと仮定します)。残念ながら、私はこの関数を膨大な回数呼び出す必要があります。この関数は明らかにこのリークを致命的にしてしまいます。ライブラリのリークからアプリを保護する
この問題を解決する方法はありますか?はいの場合、これを行うための速い方法がありますか? (関数は数十回呼び出されなければならず、約10k回後にリークが問題になる)
私は共有ライブラリから少しの量のメモリをリークする関数を使用する必要があります(ライブラリを変更できないと仮定します)。残念ながら、私はこの関数を膨大な回数呼び出す必要があります。この関数は明らかにこのリークを致命的にしてしまいます。ライブラリのリークからアプリを保護する
この問題を解決する方法はありますか?はいの場合、これを行うための速い方法がありますか? (関数は数十回呼び出されなければならず、約10k回後にリークが問題になる)
私はいくつかのアプローチについて考えることができますが、私はあなたのために何がうまくいくのか分かりません。
Boehm's gcのようなガベージコレクションメモリアロケータに切り替えます。これにより、これらのリークを掃除することができ、free()
はノーオペレーションになるため、パフォーマンスの向上につながる可能性があります。
exit()
:The Ultimate Deallocator。サブプロセスをオフにして10k回実行し、結果を親プロセスに戻します。 ApacheのWebサーバーは、サードパーティのライブラリリークによる被害を防ぐためにこれを行います。
要するに、時間がある場合は、自分で関数を書き換えることができます。壊滅的なことは、通常これが行く方法であることを意味します。もう1つの可能性は、(.soのような)ライブラリをロードしたりアンロードしたりできますか?漏れたメモリが解放される可能性があります。
私は自分で機能を書き換えるよりも、この簡単にわからないんだけど、あなたはあなたのタスクのための具体的な独自の小さなメモリアロケータ、多少、次のようになります書くことができます:(それを
をデフォルトのメモリ割り当て呼び出しを置き換える必要があります。これはライブラリ内の関数に対しても行われます)。
1)あなたは、たとえば、このモードで割り当てられたすべてのものを配置、漏れ復帰モードを入力する可能性を持っている必要があります。
2)関数が処理する前に、リークリバーティングモードを入力し、関数が終了すると終了します。
基本的には、コードの依存関係が厳しくなければ、これは役に立ちます。
もう一つの方法は、別のアプリケーションを作成し、メインとそれをペアリングすることでしょう。 2番目が終了すると、メモリは自動的に破棄されます。 googletest
フレームワークがどのように子テストを実行し、どのようにパイプが構築されているかを確認することができます。
多分私は何か間違ったことをしましたが、私のテストでは、アンロード後にヒープメモリが持続することが示されました。 – mbq