6

_CrtCheckMemory作業中の Windows アプリケーションでヒープの破損を追跡する方法を理解しようとしています。私はそれを返すことができないようですfalse。ここに私のテストコードがあります:

int* test = new int[1];
for(int i = 0; i < 100; i++){
    test[i] = 1;
}
assert( _CrtCheckMemory( ) );

上記のコードでは、 _CrtCheckMemory( )true を返します。私はデバッグモードで実行しています。_CrtCheckMemory問題にフラグを立てる簡単な例を得るには、他に何をする必要がありますか?

4

1 に答える 1

7

追加の手順が必要です。デフォルトのnew演算子をデバッグ アロケーターに置き換えるようにコンパイラーを説得する必要があります。デバッグ アロケータだけが、ヒープ ブロックのアンダーライトまたはオーバーライトを検出する「ノーマン ランド」領域を作成します。元のアロケータでコンパイルされたコードは、そうでないコードとうまく混ざりません。したがって、明示的にオプトインする必要があります。

これは、すべてのコードで確実にデバッグ アロケーターを使用できるように、コンパイル済みのヘッダー ファイル (既定では stdafx.h) で行うのが最適です。このような:

#ifdef _DEBUG
#  define _CRTDBG_MAP_ALLOC
#  define _CRTDBG_MAP_ALLOC_NEW
#  include <crtdbg.h>
#  include <assert.h>
#endif

CRTDBG マクロは malloc() 関数を取得し、新しい演算子が置き換えられます。

投稿されたコードが最初に別の診断をトリガーすることに注意してください。Windows Vista 以降では、コードが Windows ヒープの整合性を破壊したため、Windows ヒープ アロケーターが最初にエラーを出します。たとえば 2 までだけインデックスを付けることで、上書きを少し微妙にします。

于 2012-11-01T17:21:23.963 に答える