2012-02-09 66 views
2

在開始時我使用std :: map,但我需要強制地圖來釋放內存。我只使用一次地圖並分配了大量內存。該映射只返回內存,而不是OS,所以它仍然存在。如何使用boost.pool來實現像stl地圖一樣的地圖

經過一番谷歌搜索後,我發現boost.pool,但是我對如何使用它實現地圖沒有明確的想法,謝謝!

回答

0

嘗試使用交換技巧:

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

在交換,您將創建地圖對象的臨時實例,swap將交換臨時實例和基本實例和臨時實例將被破壞的內容。

+0

請問swapeed地圖有同樣的問題?也就是說,只是把內存返回給堆而不是OS,所以仍然存在... – xueyumusic 2012-02-09 09:11:30

+0

@xueyumusic:你應該嘗試一下。當你放棄堆內存('delete'或'free')時,你將內存歸還給操作系統。 STL對象通常不會在'clear'和/或'capacity'上釋放內存。 – Naszta 2012-02-09 09:14:38

-1

如果您編寫自定義分配器並將其傳遞給地圖,該怎麼辦?你的alocator可以使用clib的malloc和free。我很確定這是在操作系統級別。

你allocator類只需要實現這裏顯示的方法:http://www.cplusplus.com/reference/std/memory/allocator/

然後當你定義的std ::地圖..通過分配器類作爲第三個模板參數:http://www.cplusplus.com/reference/stl/map/

例如:

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

這從本書環節也有讓你自己的分配器一些示例代碼:http://www.josuttis.com/libbook/memory/myalloc.hpp.html

警告:我認爲大多數分配器不會將內存提供給操作系統的原因在於,稍後堅持它會更快,而不是回饋到操作系統並每次獲得更多;所以你可能會看到一些速度低效率。

編輯:也發現了這個整齊尋找HOWTO:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

+0

Boost池不能用'std :: map'開箱即用。見http://stackoverflow.com/questions/22951378/how-do-you-determine-the-size-of-the-objects-internally-created-by-a-stdmap – 2014-04-09 04:09:38