使用std :: list放置新的

时间:2013-03-20 10:21:44

标签: c++ list memory-management c++11 placement-new

我希望实现一个(双重)链接列表,其中在内部调用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必须在其组件节点上调用newdelete,但我想修改此行为,以便为所有节点分配{{ 1}}进入我的自定义池。因此我的问题是:

有没有办法指定placement new placement new,例如:

std::list

还应该使用自定义分配器分配其节点,以便所有严格存储在我自己的内存池中?

注意:我知道如果我也想在自定义内存池中使用std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>; ,则需要使用自定义分配/删除功能。)

1 个答案:

答案 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中有所改变,但我可能错了。如果您想在程序中使用多个不同的池,这才真正重要。