2011-01-29 106 views
6

在读取timdays answerthis question之后,我对boost::ptr_containerstd::vector<shared_ptr>之间的区别感到好奇。我的印象是a boost::ptr_container had ownership over the pointers given to it,一经发布,就会调用它所包含的所有指针的析构函数,而不管其他对其居民的引用如何。这与std::vector<shared_ptr>的目的是相反的,如果引用计数为0,它只会释放指针本身?boost :: ptr_container和std :: vector <shared_ptr>

如果是这样的话(我认为它没有),为什么会连Boost文档例如compare the two就好像他们是在类似的用途,以及为什么会timday的回答提出了boost::ptr_container当它的目的很不同的std::vector<shared_ptr>

回答

7

你说得对,两者差别很大。

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

但这不是唯一的区别!

  • 除非在类型明确说明,一个指针容器将不包含任何空指针
  • 一个指针容器具有深拷贝语义(使用new_clone方法),并且仅能被复制,如果所保持的物体是可复制
  • 指针容器具有很深的常量语义,即容器是const,那么不能改变它的一个元素。

至于为什么@timday觉得不得不提到升压指针容器,我认为这是因为他想扩大这个问题。 Boost指针容器非常类似于可以容纳多个对象的智能指针,并且提供了一般的指针容器的更好的语法。

关于他相比于std::vector< boost::shared_ptr<T> >我认为这很简单,因为这是自auto_ptr在没有移动语义(无unique_ptr)的实施指针的向量不能在STL容器中使用的传统方式。人们大部分时间都不知道指针容器...

1

有两种情况可以应用:比如说一堆函数充当容器的客户端,指向多态对象并对其进行操作。如果容器超出所有功能,则可以用指针容器替换它。

Timday通过指出列表中的遗漏回答了“以下一组指针[s]之间有什么区别”的问题。

相关问题