我有一个类似指针的结构,代替指针.与指针的区别在于它具有(也是特殊的)分配器可以用来释放内存的额外信息.
这种类似指针的结构适用于所有基本用途.我可以分配和释放内存,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容器向量来处理非原始指针的替代方法? …
当我遇到boost :: container :: allocator_traits :: is_partially_propagable时,我想了解boost :: container :: allocator_traits.
我在网上找不到任何关于它的文档,我可以理解除了is_partially_propagable和storage_is_unpropagable之外的所有其他boost :: container :: allocator_traits成员.
编辑:
并且,在编写容器时如何实现它们以及如何使用它们?