-1

3つのノードポインタと2つの整数を含むノードクラスがあります。すべてのノードにを割り当てますnewが、それらを呼び出すとdelete、整数がに設定され-17891602、コードの残りの境界チェックが台無しになります。何がそれを引き起こすのでしょうdeleteか?

4

3 に答える 3

5

そのdelete記憶はもうあなたのものではありません。検査しないでください。何もしないでください。そうすると、未定義の動作が発生するためです。すぐに再利用されそうです。

于 2011-11-03T04:57:43.023 に答える
0

Linux で開発して使用するgdb場合は、コマンドを使用してウォッチポイントをwatchGDB に配置できます。これは、メモリの場所がいつ上書きされたかを見つけるのに役立ちます。

于 2011-11-03T05:41:02.683 に答える
0

ポインター フィールドも新しい値を取得するかどうかを確認します。それらは 0xfeeefeee に等しいですか? (16 進数では -17891602 です。) メモリ マネージャーが解放されたメモリを上書きしている可能性があるため、アクセスする必要がなくなったメモリを読み書きしようとすると、クラッシュ ダンプで認識しやすくなります。

境界チェックを行うために解放されたオブジェクトを読み取っている場合は、未定義の動作に依存しています。使用している環境のドキュメントを調べて、解放されたメモリで何が行われるかを確認してください。境界チェッカーはそれと連携する必要があります。一般的なケースで機能するとは想定できません。

于 2011-11-03T04:59:34.593 に答える