将std::set<T>与内存池连接

3

我目前正在尝试使用自定义分配器。我有一个小应用程序,使用内存池实现了自定义分配器。你可以在这里找到它。

它可以与std::vector一起使用,但是当我尝试将其与std::set一起使用时,会出现运行时错误:

typedef std::set<Data, std::less<Data>, my_allocator<Data> > PoolSet;

Pool<Data> pool(1024);    
PoolSet set;
set.insert(Data()); // error: no pool found for type: std::_Rb_tree_node<Data>

问题在于std::set使用了我的内存分配器来分配数据和数据节点。由于没有为数据节点注册池,代码会失败。
详细信息可以在这里找到。
有人知道我如何解决这个问题吗?

你是否希望池化映射内部数据结构?如果不是,我猜你可以定义my_allocator::rebind以返回std::allocator. - Ben Voigt
1个回答

1

这是 @BenVoigt 提到的 rebind

http://en.wikipedia.org/wiki/Allocator_(C++)

分配器需要提供一个模板类成员template <typename U> struct A::rebind { typedef A<U> other; };,它使得可以获取与之相关的分配器,以不同类型为参数。例如,给定一个用于类型为int的对象的分配器类型IntAllocator,可以使用IntAllocator::rebind<long>::other来获取类型为long的对象的相关分配器类型。

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