我希望实现一个(双重)链接列表,其中仅在内部调用placement new
,将所有内存定向到分配了以下内容的池:
char *memPool = new char[4096]; // One-off normal 'new'
最初我打算实现我自己的类,它接受一个(管理一个)预分配内存池的指针。但是我想首先确定我无法用std::list
获得相同的结果。特别是the third section of David Rodríguez's answer to this SO question让我担心。
有意义std::list
必须在其组件节点上调用new
和delete
,但我想修改此行为,以便为所有节点分配{{ 1}}进入我的自定义池。因此我的问题是:
有没有办法指定placement new
placement new
,例如:
std::list
还应该使用自定义分配器分配其节点,以便所有严格存储在我自己的内存池中?
(注意:我知道如果我也想在自定义内存池中使用std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;
,则需要使用自定义分配/删除功能。)
答案 0 :(得分:5)
你必须:
MyAllocator
要求(标准中的[allocator.requirements])的类模板Allocator
。std::list<T, MyAllocator<T> >
代替std::list<T>
。如果您需要列表的类型专门std::list<T>
(例如,因为您想调用接受std::list<T> &
的函数并且您的界面无法更改),那么您就是运气不好,因为分配器类型是容器类型的一部分。
小心分配器的要求,它们很奇怪。特别是rebind
需要list
,而且有点棘手。
此外,在C ++ 03中,不能保证分配器实例得到尊重,只有分配器类型,这实际上意味着指向池的指针<'从需要重新分配需要以静态持续时间而不是作为实例变量存储。我认为在C ++ 11中有所改变,但我可能错了。如果您想在程序中使用多个不同的池,这才真正重要。