• ベストアンサー

free関数の挙動がわからない

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

mallocやfreeで管理されているメモリ(このメモリ領域は「ヒープメモリ」と言います)は「管理データ」と「ユーザーデータ」が交互に並んでいます。 そして「管理データ」には「ここは○○バイト使ってる」とか「ここは○○バイト空いてる」と言うデータが書き込まれます。 そして、mallocは「管理データを先頭から辿り、空きマークが付いている管理データを探し、管理データに使用中マークを付けてから、見つけた管理データの直後にある、ユーザーデータの先頭アドレス」を返します。 また、freeは「ユーザーデータの先頭アドレスを受け取って、その直前にある管理データを書き換え、空きマークを付ける」と言う事をします。

noname#113783
質問者

お礼

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

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

確実に挙動を把握するためにはfree()のソースを確認した方がよいかと。 MS-DOSやらWindowsやらではたいていすでに回答のついている方法で管理しているようです。 # malloc()で確保したメモリ領域が指定されたサイズより大きい。ということはありますが。 そんなワケで、バッファオーバーフローやバッファアンダーフローして書き換えた場合に、その後のmalloc()/calloc()/realloc()/free()等で吹っ飛ぶ。 という不具合発生箇所とその結果がかけ離れた場所に…というコトも起こります。

noname#113783
質問者

お礼

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

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

malloc(calloc,realloc)で確保した領域とポインタをメモリ管理システムが保存しているからです。 freeで渡されたポインタが管理保存しているポインタと一致した場合その確保領域を開放します。

noname#113783
質問者

お礼

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

関連するQ&A