6

在阅读了 timdays这个问题的回答后,我很好奇boost::ptr_container和 a之间的区别std::vector<shared_ptr>。我的印象是aboost::ptr_container对赋予它的指针拥有所有权,并且在释放时将调用它包含的所有指针的析构函数,而不管其他对其居民的引用。这与 a 的目的相反,std::vector<shared_ptr>如果 ref 计数为 0,则释放后只会释放指针本身?

如果是这种情况(我认为不是),为什么甚至 Boost 文档示例也会将两者进行比较,就好像它们的目的相似,为什么 timday 的答案会提出 aboost::ptr_container当它与 a 的目的非常不同时std::vector<shared_ptr>

4

2 回答 2

9

你是对的,两者有很大的不同。

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

但这不是唯一的区别!

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

至于为什么@timday不得不提到 Boost Pointer Container,我想是因为他想稍微拓宽一下这个问题。Boost Pointer Container 非常类似于可以容纳多个对象的智能指针,并提供比一般指针容器更好的语法。

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

于 2011-01-29T13:07:37.480 回答
1

在某些情况下两者都可以应用:比如一堆函数充当容器的客户端,取出指向多态对象的指针并对它们进行操作。如果容器的寿命超过所有功能,则可以将其替换为指针容器。

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

于 2011-01-29T11:32:17.730 回答