次の方法で共有


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

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

エディション

Visual Basic

C#

F#

C++

Web Developer

Express

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

ネイティブのみ

トピック該当なし

Pro、Premium、Ultimate

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

ネイティブのみ

トピック該当なし

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「設定の操作」を参照してください。

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

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

  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 におけるメモリ リークの検出