- ベストアンサー
free関数の挙動がわからない
free関数は動的確保したメモリを空き領域として登録するそうですが、アドレスを渡すだけでなぜ確保したメモリ領域を開放できるのでしょうか?アドレスだけでメモリ全体の大きさがわかる仕組みがあるのでしょうか。 回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
mallocやfreeで管理されているメモリ(このメモリ領域は「ヒープメモリ」と言います)は「管理データ」と「ユーザーデータ」が交互に並んでいます。 そして「管理データ」には「ここは○○バイト使ってる」とか「ここは○○バイト空いてる」と言うデータが書き込まれます。 そして、mallocは「管理データを先頭から辿り、空きマークが付いている管理データを探し、管理データに使用中マークを付けてから、見つけた管理データの直後にある、ユーザーデータの先頭アドレス」を返します。 また、freeは「ユーザーデータの先頭アドレスを受け取って、その直前にある管理データを書き換え、空きマークを付ける」と言う事をします。
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
確実に挙動を把握するためにはfree()のソースを確認した方がよいかと。 MS-DOSやらWindowsやらではたいていすでに回答のついている方法で管理しているようです。 # malloc()で確保したメモリ領域が指定されたサイズより大きい。ということはありますが。 そんなワケで、バッファオーバーフローやバッファアンダーフローして書き換えた場合に、その後のmalloc()/calloc()/realloc()/free()等で吹っ飛ぶ。 という不具合発生箇所とその結果がかけ離れた場所に…というコトも起こります。
お礼
それが手元にライブラリ関数のソースがないんですよ。 サイズが大きいこともあるんですね。 回答ありがとうございました!
- php504
- ベストアンサー率42% (926/2160)
malloc(calloc,realloc)で確保した領域とポインタをメモリ管理システムが保存しているからです。 freeで渡されたポインタが管理保存しているポインタと一致した場合その確保領域を開放します。
お礼
なるほどやっぱり管理していたんですね。 回答ありがとうございました!
お礼
詳しい解説ありがとうございます! ヒープ領域はそうやって管理していたんですね。