1

g++ ハッカーの皆さん、次の質問があります。

オブジェクトの一部のデータが欠陥のあるプログラムによって上書きされた場合、プログラムは最終的にそのオブジェクトの破壊に失敗し、二重解放エラーが発生するのはなぜですか? データが破損しているかどうかをどのように判断しますか? そして、なぜダブルフリーが発生するのでしょうか?

4

1 に答える 1

3

通常、オブジェクトのメモリが上書きされるのではなく、オブジェクトの外部のメモリの一部が上書きされます。これが malloc の制御構造にヒットした場合、free はそれらにアクセスするとパニックになり、破損した構造に基づいて奇妙なことをしようとします。

オブジェクトメモリをばかげたもので上書きするだけなら、malloc/free が知る方法はありません。プログラムがクラッシュする可能性がありますが、他の理由があります。

valgrindを見てください。これは、CPU をエミュレートし、異常がないかすべてのメモリ アクセスを監視するツールです (malloc の制御構造を上書きしようとするなど)。使い方は非常に簡単です。ほとんどの場合、valgrind 内valgrindでシェルの先頭に追加してプログラムを開始するだけで、多くの手間が省けます。

C++ に関して: new を delete と組み合わせて使用​​し、new[] を delete[] と組み合わせて使用​​することを常に確認してください。それらを決して混同しないでください。多くの場合、あなたが説明していることと同様の悪いことが起こります(ただし、valgrind は警告します)。

于 2008-11-25T11:10:32.460 に答える