2012-02-09 26 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