如何使用boost.pool实现类似STL Map的映射结构

3

一开始我使用了std::map,但是我需要强制释放map的内存。我只使用这个map一次,并且已经分配了大量的内存。这个map只会将内存返回到堆上而不是操作系统,所以它仍然存在。

在搜索后,我发现了boost.pool,但是我不清楚如何使用它来实现一个map。谢谢!

2个回答

0

尝试使用交换技巧:

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

在 swap 中,您将创建一个映射对象的临时实例,swap 将交换临时实例和基础实例的内容,然后临时实例将被销毁。

交换后的地图是否会有相同的问题?即将内存返回到堆,但不返回到操作系统,因此仍然存在... - xueyumusic
@xueyumusic:你应该试一下。当你释放堆内存(deletefree)时,你将内存归还给操作系统。STL对象通常不会在clear和/或capacity上释放内存。 - Naszta
答案仅在完美情况下有效。在现实生活中,有时会从“其他地方”分配相同页面的内存,因此无法将页面返回给操作系统。另外,std::map :: clear释放内存。 - ST3

-1

如果你编写一个自定义的分配器并将其传递给映射,则可以使用clib的malloc和free。我非常确定这是在操作系统级别。

您的分配器类只需要实现此处所示的方法:http://www.cplusplus.com/reference/std/memory/allocator/

然后,在定义std::map时,将分配器类作为第3个模板参数传递:http://www.cplusplus.com/reference/stl/map/

例如:

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

这本书中的链接还提供了一些制作自己的分配器的示例代码:http://www.josuttis.com/libbook/memory/myalloc.hpp.html

警告:我认为大多数分配器不将内存返还给操作系统的原因是,保留它以备后用比每次返回操作系统并获取更多内存更快;因此您可能会看到一些速度低效。

编辑:还发现了这个看起来很棒的教程:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079


Boost池不支持与std::map直接配合使用。请参考https://dev59.com/jH7aa4cB1Zd3GeqPrYUj。 - Dan Nissenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接