boost :: ptr_container和std :: vector <shared_ptr>

dec*_*iar 6 c++ boost memory-management smart-pointers stdvector

看完后timdays回答这个问题,我很好奇的区别boost::ptr_containerstd::vector<shared_ptr>.我的印象是,下一个boost::ptr_container在给它的指针有所有权,并在释放将召开它包含指针的析构函数,无论其居民其他参考资料.这与a的目的相反,std::vector<shared_ptr>如果ref计数为0,那么在释放之后它只会释放指针本身?

如果是这种情况(我假设不是这样),那么为什么甚至Boost文档示例都会比较两者,就好像它们的目的相似,为什么timday的答案会提出一个boost::ptr_container与a的目的非常不同的答案std::vector<shared_ptr>.

Mat*_* M. 9

你是对的,两者差别很大.

正如您所注意到的,第一个区别是所有权语义.不共享指针容器中项目的所有权.在这方面,a boost::ptr_vector<T>更接近于std::vector<std::unique_ptr<T>>.

但这不是唯一的区别!

  • 除非在类型中明确说明,否则指针容器将不包含任何空指针
  • 指针容器具有深层复制语义(使用该new_clone方法),并且只有在所保持的对象是可复制的情况下才能复制
  • 指针容器具有深度const语义,即如果容器是const一个不能改变其元素之一.

至于为什么@timday感到被迫提到Boost Pointer Container,我认为这是因为他想在某种程度上扩大这个问题.Boost Pointer Container非常像Smart Pointers,可以容纳多个对象,并提供一个更好的语法,通常指针容器.

关于他与a的比较,std::vector< boost::shared_ptr<T> >我认为这仅仅是因为这是在没有移动语义的情况下实现指针向量的传统方式(否unique_ptr),因为auto_ptr不能在STL容器中使用.人们大多数时候都不了解指针容器......