Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost.pool实现类似于stl映射的映射_C++_Stl - Fatal编程技术网

C++ 如何使用boost.pool实现类似于stl映射的映射

C++ 如何使用boost.pool实现类似于stl映射的映射,c++,stl,C++,Stl,起初我使用std::map,但我需要强制map释放内存。我只使用了一次映射,并且分配了大量内存。映射只将内存返回到堆而不是操作系统,因此它仍然存在 经过一番谷歌搜索,我找到了boost.pool,但我不清楚如何使用它实现地图,谢谢 尝试使用交换技巧: std::map<yourtype> store; ... // release store's memory store.swap(std::map<yourtype>()); std::地图存储; ... //释放存储

起初我使用std::map,但我需要强制map释放内存。我只使用了一次映射,并且分配了大量内存。映射只将内存返回到堆而不是操作系统,因此它仍然存在

经过一番谷歌搜索,我找到了boost.pool,但我不清楚如何使用它实现地图,谢谢

尝试使用交换技巧:

std::map<yourtype> store;
...
// release store's memory
store.swap(std::map<yourtype>());
std::地图存储;
...
//释放存储的内存
swap(std::map());

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

如果您编写自定义分配器并将其传递给映射,该怎么办。你的alocator可以免费使用clib的malloc。我很确定这是在操作系统级别

您的分配器类只需要实现如下所示的方法:

然后,当您定义std::map。。将分配器类作为第三个模板参数传递:

例如:

std::map
本书中的此链接还提供了一些创建自己的分配器的示例代码:

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


Edit:也发现了这个外观整洁的方法:

Swaped地图会有同样的问题吗?i、 e,将内存返回堆而不是操作系统,所以仍然存在…@xueyumusic:你应该试试。当您为堆返回内存(
delete
free
)时,您将内存返回给操作系统。STL对象通常不会在
clear
和/或
capacity
上释放内存。答案仅在完美场景中有效。在现实生活中,在其他地方的相同页面上存在分配,因此无法将页面返回到操作系统。另外,std::map::clear可以释放内存。Boost池在使用
std::map
时不能开箱即用。看见
std::map<KeyType, ValueType, less<KeyType>, MyAllocator>