メモリ リーク検出の有効化
このトピックの内容は、次の製品に該当します。
エディション |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
ネイティブのみ |
||||
Pro、Premium、Ultimate |
ネイティブのみ |
メモリ リークを検出するための主要ツールは、デバッガーと C ランタイム ライブラリ (CRT) デバッグ ヒープ関数です。
デバッグ ヒープ関数を有効にするには、次のステートメントをプログラムに追加します。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
注意
#include ステートメントは、必ずここに示した順序で記述します。順序を変更すると、関数が正しく動作しないことがあります。
crtdbg.h をインクルードすることで、malloc 関数と free 関数をそれぞれのデバッグ バージョンである _malloc_dbg と _free_dbg に対応付けます。これらが、メモリの割り当てと解放を追跡します。この対応付けは、_DEBUG が定義されているデバッグ ビルドでだけ行われます。リリース ビルドでは、通常の malloc 関数と free 関数が使用されます。
#define ステートメントにより、CRT ヒープ関数の基本バージョンがデバッグ バージョンに対応付けられます。このステートメントは必須ではありませんが、このステートメントを追加しないと、メモリ リーク情報のダンプ時に不要な情報が含まれることになります。
上記のステートメントを追加しておくと、次のステートメントをプログラムに追加することによって、通常プログラムの終了直前にメモリ リーク情報をダンプできます。
_CrtDumpMemoryLeaks();
デバッガーでプログラムが実行されると、_CrtDumpMemoryLeaks は、メモリ リーク情報を [出力] ウィンドウに表示します。次のようなメモリ リーク情報が表示されます。
Detected memory leaks!Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
#define _CRTDBG_MAP_ALLOC ステートメントを使用しなかった場合、メモリ リークのダンプは次のようになります。
Detected memory leaks!Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
_CRTDBG_MAP_ALLOC が定義されていない場合、次の項目が表示されます。
メモリ割り当て番号 (中かっこ内)
ブロック型 (normal、client、または CRT)
16 進形式で表したメモリ位置
ブロックのサイズ (バイト数)
最初の 16 バイトの内容 (16 進形式)
_CRTDBG_MAP_ALLOC が定義されている場合は、リークしたメモリが割り当てられたファイルの名前も表示されます。ファイル名に続くかっこ内の数字 (この例では 20) は、ファイル内の行番号です。
メモリが割り当てられたソース ファイル内の行に移動するには
出力ウィンドウで、ファイル名と行番号が表示されている行をダブルクリックします。
または
出力ウィンドウで、ファイル名と行番号が表示されている行を選択し、F4 キーを押します。
_CrtSetDbgFlag
_CrtDumpMemoryLeaks の呼び出しは、プログラムが常に同じ場所で終了するのであれば簡単です。しかし、プログラムを終了させる部分が複数存在する場合もあります。そのような場合は、終了する可能性のあるすべての場所で _CrtDumpMemoryLeaks を呼び出すのではなく、次の呼び出しステートメントをプログラムの冒頭に追加します。
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
このステートメントは、プログラムの終了時に自動的に _CrtDumpMemoryLeaks を呼び出します。上記のように、_CRTDBG_ALLOC_MEM_DF と _CRTDBG_LEAK_CHECK_DF の両方のビット フィールドを設定する必要があります。
CRT レポート モードの設定
前述のように、既定では _CrtDumpMemoryLeaks は、メモリ リーク情報を [出力] ウィンドウのデバッグ ペインにダンプします。_CrtSetReportMode を使用すると、この設定をリセットして別の場所に情報をダンプできます。
また、ライブラリを使用すると、情報の出力場所が別の場所に変更されることがあります。この場合は、次のステートメントを使用して、出力先を出力ウィンドウに戻すことができます。
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
詳細については、「_CrtSetReportMode」を参照してください。