Вы предполагаете что-то о деталях реализации пула.Вполне возможно, вы правы, что есть потеря, но вы не можете сделать это из шаблонов распределения, которые вы видите.
Кроме того, вы очищаете память для распределителя пула, связанного с sizeof(int)
.Однако value_type уже равен std::pair<int const, int>
, и это оставляет тот факт, что реализация карты вместо этого выделяет неопределенный тип узла.
Oh, и причина, по которой ваш распределитель работал, точно такая же:Реализация контейнера знает , что вы не можете предоставить правильный тип распределителя, поскольку выделенный тип не определен.Поэтому он всегда будет перепривязывать , чтобы получить требуемый тип .
Так что, по крайней мере, сделайте это
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), иначе вы могли бы увидеть, что Whest Boost Container имеет соответствующие данные: https://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/map.html#id463544-bb