メモリリークを検出するには
解説
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構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)