C言語なら俺に聞け(入門編)Part 87
■ このスレッドは過去ログ倉庫に格納されています
0891デフォルトの名無しさん
2011/08/08(月) 07:23:20.31mallocの実装例としては、ヒープをunionによるブロック単位で扱い、先頭をヘッダーとして用いて確保ブロックサイズを記録する方法がある。(あくまで実装方法のひとつ)
ヒープメモリー(□は未使用、■は使用中。□ひとつが16byte)
□■□□□□□■□□■■□□□□■■■□□■□□□
例:20byteを確保したい場合。
1.ヒープから20byte分を格納できる連続領域を捜す。
(20byteだから□2個分+ヘッダー用1個=3個以上連続して空いてる場所を捜す)
□■□□□□□■□□■■□□□□■■■□□■□□□
↑
ここが空いてる
そこをヘッダーとして、確保サイズの記憶に用いる。(ヘッダーに”確保サイズ20”をメモする)
□■20□□□□■□□■■□□□□■■■□□■□□□
↑
以降20byteが使用されてるという印
ヘッダーの次のアドレスをmallocの戻り値とする。(ユーザーは、ここ以降20byteを使用して良い)
□■20□□□□■□□■■□□□□■■■□□■□□□
↓
ヘッダーの次の□の位置を、mallocのリターンとして返す。
例:これを free()する場合
□■20□□□□■□□■■□□□□■■■□□■□□□
↓
free()には、malloc()の戻り値の先頭アドレスを渡す。
このアドレスを、□1つ分もどると、そこがヘッダーとして、malloc時に確保したサイズが記録されている。
この20を参考にして free()は動作する。(ヘッダーのリンクをリセットする)
備考:実際にはサイズの20だけではなく、次の空き領域へのポインターも同時に格納されてるかもしれない。(あくまで実装方法のひとつ)
a = malloc(20)で得たaを、適当に数バイト後ろに戻って、記録されてるデータを確認していけば、20という数字が見つかるかもしれない。
■ このスレッドは過去ログ倉庫に格納されています