2009-04-27 32 views

答えて

2

デバッグ時に、動的バッファをnewで取得すると、バッファの前後に特別なコードが挿入されてバッファを保護します。

例:

<Guard>=====buffer allocated on heap of required size=======<Guard> 

あなたがバッファをオーバーランした場合、挿入されたガードが破損し、あなたがバッファを削除しようとすると、デバッガは、バッファオーバーランを検出した後主張でしょう。

大きなコードベースでバッファオーバーランを検出するのが困難なビットです。 Rational Purifyのようなツールを使用して

  • :私はこのシナリオを検出するために、あなたを助けることができるいくつかの方法をお勧めします
    メモリ破損を検出するために、その優れたツールです。 GFLAGS とのWindbgによって
  • デバッグが有効になって: は私のanswerに似てここに
+0

質問他の答えに私のコメントを参照してくださいを参照してください。助けてくれてありがとう。 – Rodrigo

0

正しいオプションでは、Visual C++は各バッファの最後にガード値をスローします。バッファを解放すると、バッファがまだ有効であることを確認します。そうでない場合は、表示されているエラーが発生します。

このエラーの最も一般的な原因は、バッファオーバーランです。しかし、(理論的に)ランダムなポインタ書き込みによって引き起こされる可能性があります(結局、にガード値を書き込むことができます)。

オッズは、オーバーランです。

2

これを再現するための最も簡単な方法は次のようなものです:あなたがその割り当てられた領域を超えたメモリ位置への書き込みをしているかどうかを

//Allocate space for holding 10 ints 
int *p = new int[10]; 

//Overwrite the memory.. doesn't crash here 
p[10] = 8; 

//Try to delete..crashes.. 
delete[] p; 

チェック。

関連する問題