4

我正在寻求实现一个(双重)链表,它只在内部调用placement new,将所有内存定向到分配有类似以下内容的池:

char *memPool = new char[4096]; // One-off normal 'new'

最初我打算实现我自己的类,它需要一个指向(管理一个)预分配内存池的指针。但是,我想首先确定我无法使用std::list. 特别是,大卫罗德里格斯对这个 SO 问题的回答的第三部分让我感到担忧。

std::list必须在其组件节点上调用newand是有道理delete的,但我想修改此行为,以便将所有节点分配placement new到我的自定义池中。因此我的问题是:

有没有办法指定一个placement new std::list如:

std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;

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

注意:我知道shared_ptrs如果我也想在自定义内存池中使用自定义分配/删除函数。)

4

1 回答 1

5

你必须:

  • MyAllocator编写满足要求的类模板Allocator(标准中的[allocator.requirements])。
  • 使用 astd::list<T, MyAllocator<T> >代替 a std::list<T>

如果您需要明确的列表类型std::list<T>(例如,因为您想调用接受 astd::list<T> &并且您无法更改其接口的函数),那么您就不走运了,因为分配器类型是容器类型的一部分.

小心分配器的要求,它们很奇怪。特别是你需要rebind一个list,这有点棘手。

Furthermore, in C++03 there's no guarantee that allocator instances are respected, only the allocator type, which in effect means that the pointer to the pool you're allocating from needs to be stored with static duration rather than as an instance variable. I think that was changed in C++11, but I might be wrong. It only really matters if you want to use multiple different pools in your program.

于 2013-03-20T10:40:07.543 回答