标签: boost-container

可以通过非原始指针来提升容器向量管理内存吗?

我有一个类似指针的结构,代替指针.与指针的区别在于它具有(也是特殊的)分配器可以用来释放内存的额外信息.

这种类似指针的结构适用于所有基本用途.我可以分配和释放内存,dereferrence,increment ->等.

现在我想使用这个指针由类似STL的容器管理.早期,我意识到STL向量基本上不能处理非原始指针. T*太硬编码了,标准基本上排除了任何不是指针的东西.

受Boost.Interprocess的启发' offset_ptr<T>我决定使用Boost.Container vector,它是非常可定制的,原则上可以管理任何东西,传递给它的分配器boost::container::vector可以处理任何类似指针的东西.

现在班上boost::container::vector<T, myallocator_with_special_pointer<T>>可以做任何事......除了resize()!!

查看其中的代码boost/container/vector.hpp似乎调整大小的过程(基本上是分配,然后是复制(或移动)和释放)涉及原始指针.

违规行是:

  [line 2729:] T * const new_buf = container_detail::to_raw_pointer
     (allocator_traits_type::allocate(this->m_holder.alloc(), new_cap, this->m_holder.m_start));
Run Code Online (Sandbox Code Playgroud)

后面是后面的

  [line 3022:] this->m_holder.start(new_start);  // new_start is the same as new_buf above. 
  // member ::start(pointer&) will need to convert a raw pointer to the pointer typedef.
Run Code Online (Sandbox Code Playgroud)

两条线都绝对杀死了使用任何不是的东西的可能性raw_pointer.即使我有一个原始指针的转换运算符,其他有关特殊指针的信息也将丢失.

这个小细节似乎非常愚蠢,禁止使用非原始指针.鉴于容器的所有努力都是通用的(例如,定义pointertypedef),为什么这部分代码T*仅用于调整大小?

换句话说,为什么Boost Container不使用这一行

  [alternative] pointer const new_buf = 
     allocator_traits_type::allocate(this->m_holder.alloc(), new_cap, this->m_holder.m_start);
Run Code Online (Sandbox Code Playgroud)

是否有一种变通方法或使用Boost容器向量来处理非原始指针的替代方法? …

c++ boost pointers boost-interprocess boost-container

5
推荐指数
1
解决办法
222
查看次数

boost :: container :: allocator_traits :: is_partially_propagable是什么意思?

当我遇到boost :: container :: allocator_traits :: is_partially_propagable时,我想了解boost :: container :: allocator_traits.

我在网上找不到任何关于它的文档,我可以理解除了is_partially_propagable和storage_is_unpropagable之外的所有其他boost :: container :: allocator_traits成员.

编辑:

并且,在编写容器时如何实现它们以及如何使用它们?

c++ boost boost-container

4
推荐指数
1
解决办法
54
查看次数