メモリリークを検出するには

解説

1.まとめ

Visual C++ 2005 (Visual Studio 2005) を使用した「メモリリークの検出」に関してまとめます。
より正しくは、Visual C++ 2005 (Visual Studio 2005) の出力ウィンドウに「メモリリークの情報をダンプする方法」に関してまとめます。
「メモリリークのメモリ確保場所を特定するには」を行うことで、メモリ確保場所のソースファイル名、行番号がダンプされるようになります)

プログラムの終了直前の位置で、メモリリークの情報をダンプする _CrtDumpMemoryLeaksという関数を呼び出すと、メモリリークの情報が出力ウィンドウにダンプされるようになります。
ただし、この方法による「メモリリークの検出」は、デバッグバージョンの場合(プリプロセッサの定義で _DEBUG が定義されている場合)にしか機能しません。(_DEBUG が未定義の場合、_CrtDumpMemoryLeaks の呼び出しはプリプロセスで削除されるため)

出力ウィンドウへのメモリリークの情報のダンプの例

2.MFCアプリ-ケーション

MFCアプリケーションは、特別なプログラミングをしなくても、メモリリークの情報がダンプされます。

なぜ特別なプログラミングをしなくても、メモリリークが検出されるかというと、MFCアプリケーションのプログラムの終了処理の一環で呼ばれる、_AFX_DEBUG_STATE::~AFX_DEBUG_STATE() 関数に、_CrtDumpMemoryLeaks関数の呼び出しがあるから。
以下、~\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\dumpinit.cpp から抜粋のコード。



サンプルプロジェクト(DetectMemoryLeakMfc)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)

3.Windowsアプリケーション

Windowsアプリケーションは、WinMain 関数の最後に、_CrtDumpMemoryLeaks 関数の呼び出しを追加(_CrtDumpMemoryLeaks 関数を利用するために、crtdbg.h のインクルードも追加)すると、メモリリークの情報がダンプされるようになります。



サンプルプロジェクト(DetectMemoryLeakWin)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)

4.コンソールアプリケーション

コンソールアプリケーションは、main 関数の最後に、_CrtDumpMemoryLeaks 関数の呼び出しを追加(_CrtDumpMemoryLeaks 関数を利用するために、crtdbg.h のインクルードも追加)すると、メモリリークの情報がダンプされるようになります。



サンプルプロジェクト(DetectMemoryLeakConsole)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)