2

_CRTDBG_MAP_ALLOC を使用してメモリ リーク情報、特にファイルと行番号を取得したいのですが、最後に取得できません。私はこのようなものしか得ません:

{130} 0x00695128 の通常ブロック、16 バイト長。データ: <\ E Pi > 5C A5 45 01 02 00 00 00 01 00 00 00 E8 50 69 00

これはすべてのインクルードの前にある必要があることがわかりました:

#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>

そして、すべてのソースファイルのすべてのインクルードの後に​​これを追加することを推奨する人もいます:

#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

ただし、main.cpp で明示的にメモリ リークを追加すると、出力に行番号が表示されます。だからそれはうまくいきますが、すべてではありません...

Boost ライブラリを使用しているため、メモリ リークはすべてこれらのどこかで発生していると思われます... (shared_ptr ?)。しかし、これらのメモリリークがどこから来たのかを知るにはどうすればよいでしょうか?

4

3 に答える 3

4

一般に、_CRTDBG_MAP_ALLOC はサードパーティのコードでは役に立ちません。_CRTDBG_MAP_ALLOC は、通常のメモリ割り当て関数 (つまり、malloc) を、コンパイル時にファイルと行番号 (つまり、_malloc___dbg) を取る特別なデバッグ バージョンにリダイレクトします。サード パーティ コードが _CRTDBG_MAP_ALLOC を定義してビルドされていない場合、その情報は表示されません。また、これは CRT 以外のメモリ割り当て関数 (つまり、HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc など) には役立ちませんが、boost はほぼ確実に CRT 関数を使用します。

割り当て数が一貫している場合は、その割り当てが発生したときに _CrtSetBreakAlloc を使用してブレークポイントを設定し、どのコードがメモリを割り当てているかを確認できます。また、プログラムの最後で _CrtDumpMemoryLeaks を呼び出している場合、グローバル オブジェクトはまだ破棄されておらず、それらのメモリが出力に表示されることに注意してください。

于 2009-09-27T03:18:39.350 に答える
2

各ヒープ割り当ての前にコールバック関数を登録する _CrtSetAllocHook を使用してみてください。これを使用してリークした割り当ての行を強調表示する GUI アプリは、ここにあります: Visual Leak Detector

于 2009-09-27T02:54:18.670 に答える
0

\ _CRTDBG_MAP_ALLOC は、ヘッダーに実装されているため、ブーストのヘッダーのみのライブラリ (shared_ptr など) で動作するはずです。ただし、shared_ptr 内でメモリリークが見つかるとは思えません。shared_ptr を呼び出してもヒープメモリが割り当てられるとは思えません。これは非常によくテストされたコードであり、リークの原因はあなたにある可能性が高いことを忘れないでください。

リークがどこで発生したかについての適切な兆候がないため、サードパーティのライブラリのメモリ割り当てが原因であり、ライブラリはクリーンアップを行うことを期待していると推測します.

于 2009-09-27T15:30:23.447 に答える