多くの人は、メモリを解放するとすぐにオペレーティングシステムに戻り、他のプログラムで使用できるという印象を受けているようです。
これは真実ではありません。通常、オペレーティングシステムは4KiBページでメモリを管理します。malloc
その他の種類のメモリ管理は、OSからページを取得し、適切と思われるときにサブ管理します。プログラムが後でより多くのメモリをmallocすることを前提として、オペレーティングシステムにページを返さない可能性free()
があります。
free()
メモリをオペレーティングシステムに戻さないと言っているのではありません。これは、特に大量のメモリを解放している場合に発生する可能性があります。しかし、保証はありません。
重要な事実:不要になったメモリを解放しない場合、さらにmallocsがメモリを消費することが保証されます。ただし、最初に解放すると、代わりにmallocが解放されたメモリを再利用する可能性があります。
これは実際にはどういう意味ですか?つまり、プログラムが今後メモリを必要としないことがわかっている場合(たとえば、クリーンアップ段階にある場合)、メモリを解放することはそれほど重要ではありません。ただし、プログラムが後でより多くのメモリを割り当てる可能性がある場合は、メモリリーク、特に繰り返し発生する可能性のあるメモリリークを回避する必要があります。
また、終了直前にメモリを解放することが悪い理由の詳細については、このコメントを参照してください。
コメンターは、呼び出しfree()
が自動的に他のプログラムが解放されたメモリを使用することを許可しないことを理解していないようです。しかし、これがこの回答の要点です。
そこで、人々を納得させるために、free()がほとんど役に立たない例を示します。数学をわかりやすくするために、OSが4000バイトのページでメモリを管理していると仮定します。
100バイトのブロックを1万個割り当てたとします(簡単にするために、これらの割り当てを管理するために必要な余分なメモリは無視します)。これは1MB、つまり250ページを消費します。その後、これらのブロックのうち9000個をランダムに解放すると、1000個のブロックしか残りませんが、それらはあちこちに散らばっています。統計的には、約5ページが空になります。他の245にはそれぞれ、少なくとも1つの割り当てられたブロックがあります。これは980KBのメモリに相当し、100KBしか割り当てられていなくても、オペレーティングシステムで回収することはできません。
一方、プログラムが占有しているメモリの量を増やすことなく、malloc()をさらに9000ブロック実行できるようになりました。
技術的にOSにメモリを戻すfree()
ことができたとしても、それができない場合があります。迅速な操作とメモリの節約のバランスをとる必要があります。さらに、すでに大量のメモリを割り当ててから解放したプログラムは、再度割り当てを行う可能性があります。Webサーバーは、リクエストごとにリクエストを処理する必要があります。OSに常にメモリを要求する必要がないように、「スラック」メモリを使用可能にしておくことは理にかなっています。free()