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

时间:2011-01-29 11:22:38

标签: c++ memory-management boost smart-pointers stdvector

在阅读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文档示例compare the two就好像它们的目的相似,为什么timday的答案提出boost::ptr_container时它与std::vector<shared_ptr>的目的截然不同。

2 个答案:

答案 0 :(得分:9)

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

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

但这不是唯一的区别!

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

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

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

答案 1 :(得分:1)

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

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