首页 > 解决方案 > 清除 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中的错误吗?

标签: c++visual-studioboostpoolstdmap

解决方案


您正在假设有关池的实施细节的事情。你可能是对的,有损失,但你不能从你看到的分配模式中得出结论。

此外,您正在清除与关联的池分配器的内存sizeof(int)。但是, value_type 已经是std::pair<int const, int>,这使得 map 实现分配了一个未指定的节点类型。

哦,你的分配器工作的原因是完全相同的:容器实现知道你不可能提供正确的分配器类型,因为分配的类型是未指定的。因此它总是会重新绑定以获得所需的类型

所以,至少能做到

Live On Rextester

#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


推荐阅读