3

私は自分のアプリケーションにメモリ トラッカーを実装しているので、メモリ リークが発生した場合は、この小さな男をオンにしてそれを見つけることができます。

ファイル名や行番号が渡されないことを除いて、すべてが素晴らしいです。_CrtSetDbgFlagまたはプリプロセッサコマンド を使用して設定する必要があるフラグはありますか?

私が物事を実行した後(最低限のこと)、クリーンアップされていない26の割り当てが表示され、それらが私ではないことは確かですが、それらがどこで発生したのかわかりません.

前もって感謝します!

4

1 に答える 1

4

<crtdbg.h>ヘッダー ファイルから:

#ifdef  _CRTDBG_MAP_ALLOC
#define   malloc(s)             _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
// etc...
#endif

再定義により、探しているファイルと行番号を持つ別のバージョンの malloc が呼び出されることに注意してください。明らかに、これを機能させるには、_CRTDBG_MAP_ALLOC を #define し、crtdb.h を #include する必要があります。これは、すべてのコードがこれらのマクロを有効にしてコンパイルされることを合理的に確信できるように、プリコンパイル済みヘッダー ファイルで行うのが最適です。

それでも、この情報が得られることを保証するものではありません。プロジェクトは、それなしでコンパイルされた .lib を使用している可能性があります。もう 1 つの障害モードは、リーク レポートを生成する直前にアンロードされる可能性のある DLL です。その DLL のファイルと行情報もアンロードされます。

この種のトラブルメーカーを診断するためのフォールバックがあります。リーク レポートにはブロック番号で始まるリークの行があり、中かっこ内の先頭に示されています。そのブロック番号が実行間で安定している限り、割り当てが行われたときにデバッガーを強制的に中断できます。このコードをメイン メソッドまたはコード内の早期に実行されるポイントに配置します。

 _crtBreakAlloc = 42;   // Change the number
于 2010-11-14T12:42:05.563 に答える