Eph*_*era 4 c++ memory-management list placement-new c++11
我希望实现一个(双重)链接列表,它只在placement new内部调用,将所有内存定向到一个分配有以下内容的池:
char *memPool = new char[4096]; // One-off normal 'new'
Run Code Online (Sandbox Code Playgroud)
最初我打算实现我自己的类,它接受一个(管理一个)预分配内存池的指针.但是我想首先确定我无法达到同样的结果std::list.特别是,DavidRodríguez对这个SO问题的回答的第三部分让我担心.
它使这个意义上说std::list必须调用new和delete其组件节点,但我想修改此行为,使所有节点与被分配placement new到我的自定义池.因此我的问题是:
有没有办法指定placement new std::list如下:
std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;
Run Code Online (Sandbox Code Playgroud)
还应该使用自定义分配器分配其节点,以便一切都严格存储在我自己的内存池中?
(注意:我知道需要使用自定义分配/删除功能,shared_ptrs如果我也想在自定义内存池中使用它们.)
你必须:
MyAllocator满足Allocator要求的类模板(标准中的[allocator.requirements]).std::list<T, MyAllocator<T> >代替std::list<T>.如果你需要专门的列表类型std::list<T>(例如,因为你想调用接受a std::list<T> &并且你的接口无法改变的函数),那么你运气不好,因为分配器类型是容器类型的一部分.
注意分配器的要求,它们很奇怪.特别是你需要rebind一个list,而且有点棘手.
此外,在C++ 03中,不能保证分配器实例受到尊重,只能保证分配器类型,这实际上意味着指向您要分配的池的指针需要以静态持续时间而不是实例变量存储.我认为在C++ 11中有所改变,但我可能错了.如果您想在程序中使用多个不同的池,这才真正重要.
| 归档时间: |
|
| 查看次数: |
902 次 |
| 最近记录: |