次の方法で共有


方法 : メモリのスナップショットを取得する

更新 : 2007 年 11 月

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

Edition

Visual Basic

C#

C++

Web Developer

Express

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

ネイティブのみ

トピック該当なし

Standard

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

ネイティブのみ

トピック該当なし

Pro/Team

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

ネイティブのみ

トピック該当なし

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

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

既定で非表示のコマンド

8ky2wh64.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

ここでは、メモリ リークの位置を特定するためにメモリのスナップショットを取得する方法について説明します。

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

  1. CMemoryState のメンバ オブジェクトを作成し、CMemoryState::Checkpoint メンバ関数を呼び出します。これにより、メモリの最初のスナップショットが作成されます。

  2. プログラムでメモリの割り当てと解放が行われた後、別の CMemoryState オブジェクトを作成し、このオブジェクトの Checkpoint を呼び出します。これにより、メモリ状態の 2 番目のスナップショットが取得されます。

  3. 3 番目の CMemoryState オブジェクトを作成し、そのメンバ関数 CMemoryState::Difference を呼び出します。このとき、前に作成した 2 つの CMemoryState オブジェクトを引数として渡します。2 つのメモリ状態に違いがある場合、Difference 関数は 0 以外の値を返します。この値は、解放されていないメモリ ブロックがあることを示します。

    コードの例を次に示します。

    // Declare the variables needed
    #ifdef _DEBUG
        CMemoryState oldMemState, newMemState, diffMemState;
        oldMemState.Checkpoint();
    #endif
    
        // Do your memory allocations and deallocations.
        CString s("This is a frame variable");
        // The next object is a heap object.
       CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
    
    #ifdef _DEBUG
        newMemState.Checkpoint();
        if( diffMemState.Difference( oldMemState, newMemState ) )
        {
            TRACE( "Memory leaked!\n" );
        }
    #endif
    

    メモリ チェック用のステートメントが #ifdef _DEBUG と #endif で囲まれていることに注意してください。これによって、このコードはプログラムの Win32 デバッグ バージョンでだけコンパイルされます。

    メモリ リークが発生していることを確認できたので、メモリ統計情報の表示のために別のメンバ関数 CMemoryState::DumpStatistics を呼び出して、メモリ リークの位置を特定できます。

参照

参照

_DEBUG

その他の技術情報

MFC におけるメモリ リークの検出