2012-02-09 5 views
2

最初はstd :: mapを使用しますが、マップを強制的にメモリの割り当てを解除する必要があります。私は地図を一度しか使用せず、大きなメモリを割り当てています。マップはOSにではなくヒープするためのメモリだけを返すので、まだ存在しています。boost.poolを使用してstl mapのようなマップを実装する方法

いくつかのGoogleの後で、私はboost.poolを見つけましたが、それを使ってマップを実装する方法についての明確なアイデアはありません。

答えて

0

てみスワップトリックを使用する:スワップで

std::map<yourtype> store; 
... 
// release store's memory 
store.swap(std::map<yourtype>()); 

あなたがマップオブジェクトの一時的なインスタンスを作成します、swapは一時的なインスタンスとベースインスタンスと一時インスタンスの内容が破壊されるスワップします。

+0

はswapeedマップは同じ問題を抱えているのでしょうか?すなわち、メモリをヒープに戻しますが、OSには戻さないので、まだ存在しています。 – xueyumusic

+0

@xueyumusic:あなたはそれを試してください。ヒープメモリ( 'delete'または' free')を返すと、メモリがOSに返されます。 STLオブジェクトは、通常、「クリア」および/または「容量」でメモリを解放しません。 – Naszta

-1

カスタムアロケータを作成してマップに渡すとどうなりますか?あなたのアロケータは、clibのmallocを自由に使うことができます。私はそれがOSレベルにあるとはかなり確信しています。あなたのstd ::マップを定義するときに...そして、http://www.cplusplus.com/reference/std/memory/allocator/

を第三テンプレート引数としてアロケータクラスを渡します:http://www.cplusplus.com/reference/stl/map/

例:

あなたのアロケータクラスは、ここでしか示したメソッドを実装する必要があります

std::map<KeyType, ValueType, less<KeyType>, MyAllocator> 

この本から、このリンクはまた、独自のアロケータを作成するためのいくつかのサンプルコードがありますhttp://www.josuttis.com/libbook/memory/myalloc.hpp.html

警告:私は、ほとんどのアロケータがOSにメモリを戻さない理由は、OSに戻ってより多くの時間を得るよりも、後でそれを保持するほうが速いことだと思います。速度の非効率性が見られるかもしれません。

編集:はまた、このきちんと見ているHOWTOが見つかりました:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

+0

ブーストプールは 'std :: map'ですぐに動作しません。 http://stackoverflow.com/questions/22951378/how-do-you-determine-the-size-of-the-objects-internally-created-by-a-stdmapを参照してください。 –

関連する問題