繁体   English   中英

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

[英]boost::ptr_container and std::vector<shared_ptr>

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

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

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

正如您所注意到的,第一个区别是所有权语义。 不共享指针容器中项目的所有权。 在这方面, 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容器中。 人们大多数时候都不了解指针容器......

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM