メモリのブロックをに渡す場合free
、そのメモリは必ずしもすぐにオペレーティングシステムに戻されるとは限りません。実際、C標準の表現に基づいて、プログラムが終了するまでメモリをOSに戻すことができないと主張する人もいます。
問題の文言は(C99、§7.20.3.2/ 2)です。「free関数を使用すると、ptrが指すスペースの割り当てが解除されます。つまり、さらに割り当てられるようになります。」彼らの主張は、メモリのブロックが割り当てられてから解放された場合、それは再び割り当て可能になるはずですが、OSに戻された場合、他のプロセスがそれを取得する可能性があるため、それ以上の割り当てには使用できなくなります、標準が要求するように。個人的には、その議論が完全に説得力があるとは思いませんが(「別のプロセスによって割り当てられた」というのはまだ割り当てだと思います)、それは人生です。
ほとんどのライブラリは、OSからメモリの大きなチャンクを割り当ててから、それらの大きなチャンクの一部をプログラムにサブ割り当てします。プログラムによってメモリが解放されたら、そのメモリブロックを「使用可能な」リストに入れてさらに割り当てます。ほとんどの場合(少なくとも時々)、空きブロックのリストをウォークスルーし、隣接するアドレスである空きブロックをマージします。
また、多くの人は、解放された後に保持するメモリについていくつかのヒューリスティックに従います。まず、そのブロック内のメモリのいずれかが使用されている限り、ブロック全体を保持します。ただし、ブロック内のすべてのメモリが解放されている場合は、そのサイズと、(多くの場合)使用可能な空きメモリの量を確認します。使用可能な量や空きブロックのサイズがあるしきい値を超えると、通常はOSに解放されます。
しきい値を固定するのではなく、(たとえば)固定サイズではなく使用可能なメモリのパーセンテージに基づいてしきい値を設定することにより、環境に合わせて動作を調整しようとするものもあります。それがなければ、利用可能なメモリが通常はるかに小さい10年前に作成されたプログラムは、多くの場合、かなりの「スラッシング」を実行します。つまり、同じ(または同様の)サイズのブロックをOSとの間で繰り返し割り当てたり解放したりします。