c++ - 清除 std::map 的 boost::pool_allocator 不会返回 VS2017 中的整个池
问题描述
当我在 VS2017 中运行下一个代码时:
#include <boost/pool/pool_alloc.hpp>
#include <map>
#include <iostream>
int main()
{
using Map = std::map<int, int, std::less<int>, boost::pool_allocator<std::pair<const int, int>>>;
using Pool = boost::singleton_pool<boost::pool_allocator_tag, sizeof(Map)>;
Map temp;
for (int i = 1; i < 5; i++) temp[i] = i;
std::cout << "First addresses:\n";
for (auto& kv : temp) std::cout << &kv.second << "\n";
temp.clear();
Pool::purge_memory();
Map temp2;
for (int i = 1; i < 5; i++) temp2[i] = i;
std::cout << "Second addresses:\n";
for (auto& kv : temp2) std::cout << &kv.second << "\n";
temp2.clear();
Pool::purge_memory();
return 0;
}
我得到输出:
First addresses:
02A108F4
02A1090C
02A10924
02A1093C
Second addresses:
02A1090C
02A10924
02A1093C
02A10954
这种行为似乎不正确:地址发生了什么02A108F4
?似乎在清除过程中它没有返回到池中。
std::vector
当我使用 a而不是 a时,不会发生这种情况std::map
。gcc 似乎也正确地返回了内存:Live example。
这是VS2017中的错误吗?
解决方案
您正在假设有关池的实施细节的事情。你可能是对的,有损失,但你不能从你看到的分配模式中得出结论。
此外,您正在清除与关联的池分配器的内存sizeof(int)
。但是, value_type 已经是std::pair<int const, int>
,这使得 map 实现分配了一个未指定的节点类型。
哦,你的分配器工作的原因是完全相同的:容器实现知道你不可能提供正确的分配器类型,因为分配的类型是未指定的。因此它总是会重新绑定以获得所需的类型。
所以,至少能做到
#include <boost/pool/pool_alloc.hpp>
#include <map>
#include <iostream>
using Map = std::map<int, int, std::less<int>, boost::pool_allocator<int>>;
using Pool = boost::singleton_pool<boost::pool_allocator_tag, sizeof(Map::value_type)>;
void foo() {
Map temp;
for (int i = 1; i < 5; i++) temp[i] = i;
std::cout << "First addresses:\n";
for (auto& kv : temp) std::cout << &kv.second << "\n";
}
int main()
{
foo();
Pool::purge_memory();
foo();
Pool::purge_memory();
}
不过,这仍然是假设实现细节。我认为c++17 为您提供了更多信息(http://en.cppreference.com/w/cpp/container/node_handle),否则您可以看到 Boost Container 是否有相关详细信息:https:// www.boost.org/doc/libs/1_51_0/doc/html/boost/container/map.html#id463544-bb
推荐阅读
- python - 在 Django 中按下按钮时渲染
- r - R 绘制多项式回归线
- javascript - 我如何在javascript中使用innerhtml选择列表元素?
- linux - 数据库进程在 OS Linux 中运行时从一位用户运行时出现错误
- oracle - 如何在 Oracle 中插入不同的值
- azure-devops - 如何与使用 azure devops 创建的利益相关者共享魅力测试报告
- javascript - 如何将数据从服务器传输到客户端 js 文件?
- asp.net-mvc - Select2 Asp.net MVC - 初始数据不重视下拉列表
- angularjs - 如何在 angularjs 中添加引导日期时间选择器
- perl - new SomeModule::SomeName vs SomeModule::SomeName->new(),有什么区别?