win32とCRTで簡単なメモリリーク診断とリーク位置の発見

投稿者: | 2015/10/31 土曜日

VC6の素のwin32プロジェクトが前提。

プログラムの最初のほうで以下を書く

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
 
int iiiii = _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

ここではStdAfx.cppに書いた。_CrtSetDbgFlagを呼ぶことでプログラム終了時にリークがあると以下のように出力される。

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}に注目してコードの先頭で以下のように書く。

_CrtSetBreakAlloc(47);

こうするとリークするアロックのときブレークするのでコールスタックからリーク位置が分かる。

これで判明するのはmalloc, calloc, realloc, newなどのCRT関連で、HeapAllocやSysAllocStringなどは対象外。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です