Cでは、関数void *
の引数としてaを渡すのはfree
悪い習慣ですか?void *
そうでない場合、関数は、ポイントする場所から開始して解放するメモリの量をどのように知るのでしょうか?
4 に答える
free()
メモリブロックの開始アドレスのみが必要です。その内容は関係ありません。そのため、実際にはvoid*
署名にが含まれています(したがって、どの種類のポインターを渡すかは関係なく、常にを取得しますvoid*
)。
この関数は、、またはへの前回の呼び出しによって返された必要がある、が
free()
指すメモリスペースを解放します。ptr
malloc()
calloc()
realloc()
ご覧のとおり、これらの関数の1つによって割り当てられたメモリのみを解放できます。これらの関数はブロックのサイズを内部に保存します。
興味がある場合は、情報を1つの場所にある別の構造に保存する必要はありません。たとえば、デフォルトのmalloc
/のさまざまな置換では、 free
N +Mバイトのメモリを割り当てるのが一般的です。Mはメタデータ構造体のサイズです。その割り当てによって返されたアドレスに、独自のメタデータ(割り当てられたサイズなど)を格納してから、メタデータの直後のメモリを指すptr+Mを返します。
そのメモリを解放するときは、アドレスからMを引くだけで、メタデータを指す初期ポインタを取得できます。
freeはデータ型を必要とせず、void *
正常に動作します。解放されるメモリの量は、内部で管理されます。free
重要なのは、互換性のある割り当て関数から以前に取得した値に渡すことですmalloc
。それはその仲間です。
free()
実装は、渡されたポインタから、解放するヒープ セルの大きさを知る必要があります。malloc()
ポインタは、calloc()
またはから取得する必要がありますrealloc()
。正確な方法はプラットフォームごとに異なる場合があります。移植可能なコードのために、技術的な詳細を想定する必要はありません。
void*
引数の型を指定するのに適した方法です。他のポインター型からの暗黙的なダウングレード変換を利用できるからです。
実際にメモリを解放することはありません。他のプログラムがここでもメモリを割り当てることができるようにするだけです。ところで、適切なメモリの長さが必要な場合は、機能がありますstrlen
。(それについてはわかりません)