1
* glibc detected ./load: double free or corruption (!prev): ADDRESS **

glibc を使用する場合、二重解放していることをどのように認識しますか? 私が malloc して解放したものはすべて追跡されますか? free はどのくらいのスペースを解放するかをどのように知っているかのようなメタデータに含まれていますか ( free はどのくらい解放するかをどのように知っていますか? )

4

4 に答える 4

1

何かを malloc すると、メモリ ブロックへのポインターが取得されます。それはもうご存知ですよね^^。メモリ管理は、ブロックの前に (たとえば、ブロックのサイズを追跡する) (隠し) ヘッダーも予約します。free 操作では、ヘッダーも消去されます。2 回解放すると、ヘッダーは 2 回目の解放では無効になります。したがって、検出。

于 2013-09-03T11:25:19.437 に答える
0

C 言語標準では、ポインターを 2 回解放することは未定義の動作であると規定されています。glibc で見られるのは、メッセージが発行される、この未定義の動作の 1 つの特定のケース (役立つもの) です。ほとんどのアロケーターは、割り当てられたものを追跡し、解放されたものを追跡できる量までは追跡します。しかし、この振る舞いを当てにすることはできません。

AC プログラムは、黙ってクラッシュしたり、状況を無視したり (または必要と思われるその他のアクション) することもできます。

于 2013-09-03T11:25:48.933 に答える