折り返しmalloc
やfree
[または]new
をdelete
別の関数で行う以外に、実際には非常に大まかな見積もり以外のものが得られるかどうかは非常に疑わしいです。
問題の1つは、解放されたメモリは、メモリの長い連続したチャンクがある場合にのみ解放できることです。通常発生するのは、ヒープ全体で使用されるメモリの「小さなビット」があり、解放できる大きなチャンクを見つけることができないということです。
これを簡単な方法で修正できる可能性はほとんどありません。
ちなみに、後でさらに負荷がかかると、アプリケーションで50 MBが必要になる可能性があるため、アプリケーションを解放するのは無駄な労力です。
(使用していないメモリが他の目的で必要な場合、それはスワップアウトされ、長時間触れられていないページが最有力候補であるため、システムが他のタスクのためにメモリを使い果たした場合、それでもそのスペースのためにマシンのRAMを再利用するので、無駄にそこに座っているわけではありません-プログラムが使用するRAMの量を把握するために「ps」などを使用できないだけです!)
コメントで示唆されているように、独自のメモリアロケータmmap()
を作成して、部分を削除するための「チャンク」を作成することもできます。多くのメモリ割り当てを行うコードのセクションがあり、それらすべてが後で確実に解放されて、別のメモリの塊からすべてを割り当てる場合、すべてが解放されたら、mmapを配置できます。 d領域を「フリーmmap
リスト」に戻し、リストが十分に大きい場合は、mmap
割り当ての一部を解放します[これは、mmapを何度も呼び出さないようにするためです。munmap
再び数ミリ秒後]。ただし、これらのメモリ割り当ての1つをフェンスで囲まれた領域から「エスケープ」させると、アプリケーションがクラッシュする可能性があります(さらに悪いことに、クラッシュすることはありませんが、アプリケーションの他の部分に属するメモリを使用すると、非常に多くのメモリが割り当てられます。あるユーザーが別のユーザー向けのネットワークコンテンツを見るなど、どこかで奇妙な結果になります!)