次の方法で共有


_crtBreakAllocを使用してメモリ割り当てをデバッグする

この記事では、 _crtBreakAlloc を使用してメモリ割り当てをデバッグする方法について説明します。

元の製品バージョン: Visual C++
元の KB 番号: 151585

まとめ

デバッグ C ランタイム (CRT) を使用してメモリ リークを追跡する場合、多くの場合、リークの原因となるメモリを割り当てる直前にブレークポイントを設定すると便利です。 コンパイル時または実行時に _crtBreakAlloc を設定すると、特定のメモリ割り当て時点でユーザー定義ブレークポイントを発生させることができます。

詳細

_CrtDumpMemoryLeaksなどの Debug-CRT 関数を使用してメモリ リークを追跡すると、多くの場合、中かっこ ({}) で囲まれた割り当て番号が表示されます。 たとえば、割り当て番号 18 でのメモリ リークを次に示します。

メモリ リークが検出されました。
オブジェクトのダンプ ->
{18} normal block at 0x00660BE4, 10 bytes long
データ: <> CD CD CD CD CD CD CD CD
オブジェクト ダンプが完了しました。

このメモリが割り当てられる直前にブレークポイントを設定すると、呼び出し履歴をステップ実行して、このメモリが割り当てられる原因となっている関数を確認できます。 Debug-CRT 関数 _CrtSetBreakAlloc 、中断する割り当て番号を指定できます。 このメソッドでは、割り当てブレークポイントを設定するたびにプログラムを再コンパイルする必要があります。 別の方法として、[ウォッチ] ウィンドウを使用し、割り当てブレークポイントを動的に設定します。 このメソッドには、ソース コードの変更や再コンパイルを必要としないという利点があります。

C ランタイムに静的にリンクしている場合、変更する変数は _crtBreakAlloc と呼ばれます。 C ランタイムに動的にリンクしている場合、Visual C++ 4.0 または 4.1 を使用している場合、[ウォッチ] ウィンドウで変更する変数は {,,msvcr40d.dll}__p__crtBreakAlloc() 。 Visual C++ 4.2 以降を使用している場合は、[ウォッチ] ウィンドウで変更する変数を {,,msvcrtd.dll}__p__crtBreakAlloc() する必要があります。

コンパイルする CRT のバージョンを確認するには、次の手順を実行します。

  1. Build メニューから Settings を選択します。

  2. Settings for: ペインで、ビルドする構成を選択します。 [ C/C++ ] タブを選択し、[ Code Generation カテゴリを選択します。

[ランタイム ライブラリの使用] ダイアログボックスが表示され、使用している CRT のバージョンが表示されます。 (この設定が空白の場合は、[設定] ウィンドウで 1 つの構成のみを選択していることを確認します)。

割り当てブレークポイントを動的に設定するには、次の手順を実行します。

  1. デバッグ セッションを開始します。 [ビルド] メニューの [デバッグ] -> [ステップ イン] を選択します。 "シングル スレッドのデバッグ" または "マルチスレッド CRT のデバッグ" を使用している場合は、手順 1a に従います。 それ以外の場合は、手順 1b に従います。

    1. [ウォッチ] ウィンドウに「 _crtBreakAlloc 」と入力します。 プログラムが停止する現在の割り当て番号が表示されます。 この割り当て番号は、プログラムの初回起動時に -1 にする必要があります。

    2. Visual C++ 4.0 または 4.1 を使用している場合は、ウォッチ ウィンドウに「 {,,msvcr40d.dll}__p__crtBreakAlloc() 」と入力します。 Visual C++ 4.2 以降を使用している場合は、「 {,,msvcrtd.dll}__p__crtBreakAlloc() 」と入力します。 プログラムが停止する現在の割り当て番号が表示されます。 この割り当て番号は、プログラムの初回起動時に -1 にする必要があります。

  2. -1 値をダブルクリックし、ユーザー定義ブレークポイントの原因となる新しい割り当て番号を入力します。

  3. Debug メニューの Debug ->Go を選択します。

_crtBreakAllocの詳細については、オンライン ヘルプのヒープ割り当て要求の追跡を参照してください。