0

暗黙的に(libsとそのDLLを使用して)DLLをロードするホストプログラムがあります。ホストプログラムで意図的にメモリリークを発生させると、CrtDbg*関数がリークを検出します。意図的にDLLの1つでメモリリークを発生させた場合、リークは検出されません。

注:私のホストでは_CrtDumpMemoryLeaks、メイン関数が終了した後に関数をアクティブにします。

4

1 に答える 1

4

おそらく、DLLは静的にCRTにリンクしています。(または、リテールビルドですが、EXEはデバッグビルドです)。いずれにせよ、ヒープは複数あります。_CrtDeumpMemoryLeaksを呼び出すと、呼び出し元のバイナリの解放されていないメモリ割り当てのみを追跡できます。2つのオプションがあります。

  • すべてのコード(DLLとEXE)を変更して、静的リンクではなく同じMSVCRTDLLにリンクします。各バイナリのプロジェクト設定で、CRTへのリンクタイプとして「MultithreadedDEBUGDLL」または「MultithreadedDLL」を選択します。静的を選択しないでください。次に、すべてのDLLとEXEが同じヒープを共有します。

また

  • 「DetectMemoryLeaks」と呼ばれる各DLLから関数をエクスポートします(または、他のDLLと同様の名前の関数であるため、名前の競合は発生しません)。この関数は_CrtDumpMemoryLeaksを呼び出すだけです。EXEから、_CrtDumpMemoryLeaksを呼び出すのとほぼ同時にこの関数を呼び出します。各DLLの各ヒープは、リークがないかチェックされます。
于 2013-01-13T09:18:08.010 に答える