dポイントプレゼントキャンペーン実施中!

free関数は動的確保したメモリを空き領域として登録するそうですが、アドレスを渡すだけでなぜ確保したメモリ領域を開放できるのでしょうか?アドレスだけでメモリ全体の大きさがわかる仕組みがあるのでしょうか。
回答よろしくお願いします。

A 回答 (3件)

mallocやfreeで管理されているメモリ(このメモリ領域は「ヒープメモリ」と言います)は「管理データ」と「ユーザーデータ」が交互に並んでいます。



そして「管理データ」には「ここは○○バイト使ってる」とか「ここは○○バイト空いてる」と言うデータが書き込まれます。

そして、mallocは「管理データを先頭から辿り、空きマークが付いている管理データを探し、管理データに使用中マークを付けてから、見つけた管理データの直後にある、ユーザーデータの先頭アドレス」を返します。

また、freeは「ユーザーデータの先頭アドレスを受け取って、その直前にある管理データを書き換え、空きマークを付ける」と言う事をします。
    • good
    • 1
この回答へのお礼

詳しい解説ありがとうございます!
ヒープ領域はそうやって管理していたんですね。

お礼日時:2009/08/11 20:32

確実に挙動を把握するためにはfree()のソースを確認した方がよいかと。



MS-DOSやらWindowsやらではたいていすでに回答のついている方法で管理しているようです。
# malloc()で確保したメモリ領域が指定されたサイズより大きい。ということはありますが。

そんなワケで、バッファオーバーフローやバッファアンダーフローして書き換えた場合に、その後のmalloc()/calloc()/realloc()/free()等で吹っ飛ぶ。
という不具合発生箇所とその結果がかけ離れた場所に…というコトも起こります。
    • good
    • 0
この回答へのお礼

それが手元にライブラリ関数のソースがないんですよ。
サイズが大きいこともあるんですね。
回答ありがとうございました!

お礼日時:2009/08/11 23:00

malloc(calloc,realloc)で確保した領域とポインタをメモリ管理システムが保存しているからです。


freeで渡されたポインタが管理保存しているポインタと一致した場合その確保領域を開放します。
    • good
    • 0
この回答へのお礼

なるほどやっぱり管理していたんですね。
回答ありがとうございました!

お礼日時:2009/08/11 20:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!