メモリ リーク検出の有効化

更新 : 2007 年 11 月

このトピックの内容は、次の製品に該当します。

Edition

Visual Basic

C#

C++

Web Developer

Express

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Standard

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Pro/Team

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

トピックは該当しますが、コマンドは既定では非表示です

既定で非表示のコマンド

メモリ リークを検出するための主要ツールは、デバッガと C ランタイム ライブラリ (CRT) デバッグ ヒープ関数です。デバッグ ヒープ関数を有効にするには、次のステートメントをプログラムに追加します。

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
e5ewb1h3.alert_note(ja-jp,VS.90).gifメモ :

#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_MAPALLOC ステートメントを使用しなかった場合、メモリ リークのダンプは次のようになります。

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」を参照してください。

参照

概念

メモリ リークの検出と特定