1

C++ で反復手順を実行しています。最初の反復が期待どおりに完了した後、2 番目から次のエラーが発生します。

00000000212005D0 のヒープ ブロックが 0000000021200674 で変更され、要求されたサイズの 94 を超えました Windows は myProject.exe でブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、myProject.exe または読み込まれた DLL のバグを示しています。

これは、myProject.exe にフォーカスがあるときにユーザーが F12 キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。

このエラーが表示されている間、visual-c++ は dbgheap.c を開き、次のセクションを強調表示します。

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
        const void * pUserData
        )
{
        if (!pUserData)
            return FALSE;

        if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
            return FALSE;

        return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}

このエラーの原因は何ですか?

4

2 に答える 2

4

そのセクションは、ヒープの有効性をチェックする方法であり、問​​題の原因ではありません。

ほとんどの場合、メモリの破損に対処している可能性が高く、デバッグが難しい場合があります。最善の策は、メモリ アナライザー ツール (Purify など) を実行するか、コードベースが小さい場合は自分で調べて、ソースが見つかるまで部分を削除することです。

もちろん、あらゆる種類の未定義の動作がこれにつながる可能性があります。最も一般的なソースは次のとおりです。

  • 戻り値の型を定義する関数から戻るのを忘れる
  • オブジェクトを複数回削除する
  • virtualデストラクタのない基本クラスへのポインタを介して派生オブジェクトを削除する
  • キャストの無効な使用 (C スタイルのキャストconst_cast、、、reinterpret_cast)
  • 所有していないメモリへのアクセス (割り当てられたメモリの境界を超えた書き込み)
  • など(ここに自由に追加してください

私は完全な再構築から始めます...あなたは決して知りません!

于 2012-05-18T12:18:14.307 に答える
0

浄化にアクセスできない場合は、valgrind も優れたツールであり、おそらくこのエラーをキャッチすることを付け加えておきます。

また、valgrind を使用すると、プロジェクトを再度ビルドする必要がありません (purify の場合と同様)。valgrind を使用してデバッグ実行可能ファイルを実行するだけで、valgrind も高速です。

于 2012-05-18T12:39:59.837 に答える