VC6の素のwin32プロジェクトが前提。
プログラムの最初のほうで以下を書く
1 2 3 4 5 |
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> int iiiii = _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); |
ここではStdAfx.cppに書いた。_CrtSetDbgFlagを呼ぶことでプログラム終了時にリークがあると以下のように出力される。
1 2 3 4 5 |
Detected memory leaks! Dumping objects -> {47} normal block at 0x01311C00, 10 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD Object dump complete. |
ここにファイル名を表示させたりもできるが今回はスルー。上記の{47}に注目してコードの先頭で以下のように書く。
1 |
_CrtSetBreakAlloc(47); |
こうするとリークするアロックのときブレークするのでコールスタックからリーク位置が分かる。
これで判明するのはmalloc, calloc, realloc, newなどのCRT関連で、HeapAllocやSysAllocStringなどは対象外。