| ホーム > プログラミング > Windows プログラミング > メモリリークを検出するには |
Visual C++ 2005 (Visual Studio 2005) を使用した「メモリリークの検出」に関してまとめます。
より正しくは、Visual C++ 2005 (Visual Studio 2005) の出力ウィンドウに「メモリリークの情報をダンプする方法」に関してまとめます。
(「メモリリークのメモリ確保場所を特定するには」を行うことで、メモリ確保場所のソースファイル名、行番号がダンプされるようになります)
プログラムの終了直前の位置で、メモリリークの情報をダンプする _CrtDumpMemoryLeaksという関数を呼び出すと、メモリリークの情報が出力ウィンドウにダンプされるようになります。
ただし、この方法による「メモリリークの検出」は、デバッグバージョンの場合(プリプロセッサの定義で _DEBUG が定義されている場合)にしか機能しません。(_DEBUG が未定義の場合、_CrtDumpMemoryLeaks の呼び出しはプリプロセスで削除されるため)
出力ウィンドウへのメモリリークの情報のダンプの例
MFCアプリケーションは、特別なプログラミングをしなくても、メモリリークの情報がダンプされます。
なぜ特別なプログラミングをしなくても、メモリリークが検出されるかというと、MFCアプリケーションのプログラムの終了処理の一環で呼ばれる、_AFX_DEBUG_STATE::~AFX_DEBUG_STATE() 関数に、_CrtDumpMemoryLeaks関数の呼び出しがあるから。
以下、〜\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\dumpinit.cpp から抜粋のコード。
サンプルプロジェクト(DetectMemoryLeakMfc)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)
Windowsアプリケーションは、WinMain 関数の最後に、_CrtDumpMemoryLeaks 関数の呼び出しを追加(_CrtDumpMemoryLeaks 関数を利用するために、crtdbg.h のインクルードも追加)すると、メモリリークの情報がダンプされるようになります。
サンプルプロジェクト(DetectMemoryLeakWin)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)
コンソールアプリケーションは、main 関数の最後に、_CrtDumpMemoryLeaks 関数の呼び出しを追加(_CrtDumpMemoryLeaks 関数を利用するために、crtdbg.h のインクルードも追加)すると、メモリリークの情報がダンプされるようになります。
サンプルプロジェクト(DetectMemoryLeakConsole)
(CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリーク検出のサンプルプロジェクト)
コメント
ご意見、ご感想、ご質問、ご要望等は、「コメントを投稿する」もしくは「ホーム
> コンタクト」よりお願いいたします。
内容の誤り、誤字脱字、リンクミスなどの問題点を発見された場合には「コメントを投稿する」もしくは「ホーム
> コンタクト」より連絡していただけると幸いです。
Copyright (c) 2004-2010 Nobuki HIRAMINE All rights reserved.