3

重複の可能性:
C プログラミング : free は解放する量をどうやって知るのですか?

free(myPtr)長さのパラメーターが必要ないのはなぜでしょうか? 解放するメモリの量をどのように知るのですか?

特定の開始アドレスごとに割り当てられたメモリ量を追跡していると推測できます。

4

2 に答える 2

8

これは、malloc が割り当てられたチャンクの長さに関する情報を、通常はプログラムに返されるアドレスの前の場所に保存するためです。実装が size_t に余分なストレージを割り当て、そこにサイズを置き、sizeof(size_t) を追加して、それを malloc されたポインターとして返すことは珍しくありません。ただし、標準はこの実装を要求していないため、たとえばハッシュテーブルに基づいて、代替の実装が可能です。

于 2012-08-10T00:49:22.770 に答える
3

C がメモリを割り当てるとき、与えられたポインタに関連付けられた長さを記録します。(多くの場合、メモリ ブロックの直前の領域にありますが、これは実装の詳細です。) 渡されたメモリ ブロックのある種のテーブルまたはリストを保持し、そのメモリを解放すると、C はそのブロック ベースの長さを検索します。ポインタの値。

freeこれが、渡すポインタが から返されるポインタと正確に等しくなければならない理由の一部ですmalloc。そうでない場合、C は混乱し、正しいメモリ ブロック (またはその長さ) を見つけることができず、実際に触れてはならないメモリを「解放」してしまう可能性があります。(そうすると、「ヒープの破損」と呼ばれる状態になる可能性があります。これは非常に悪いことです。それ以降、C は、既存のヒープの途中でメモリを割り当てようとするなど、あらゆる種類の奇妙なことを行う可能性があります。そこにあるものは何でもブロックしてマングリングします。)

于 2012-08-10T00:55:16.060 に答える