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

6
阅读了 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> 的目的非常不同。

2个回答

9
你是正确的,两者有很大的不同。
首先,正如你所注意到的,所有权语义不同。指针容器中的项目所有权不是共享的。在这方面,boost::ptr_vector 更接近于 std::vector>。
但这并不是唯一的区别!
- 除非在类型中明确声明,否则指针容器不包含任何空指针 - 指针容器具有深拷贝语义(使用 new_clone 方法),只有可复制的对象才能进行复制 - 指针容器具有深度 const 语义,即如果容器是 const,则不能更改其元素。
至于为什么 @timday 觉得有必要提到 Boost Pointer Container,我认为这是因为他想扩大问题的范围。Boost Pointer Container 很像可以容纳多个对象的智能指针,并提供了比指针容器更好的语法。
关于他与 std::vector> 的比较,我认为这仅仅是因为在没有移动语义(没有 unique_ptr)的情况下实现指针向量的传统方式,因为 auto_ptr 不能用于 STL 容器。人们大多数时候都不知道指针容器...

1

有些情况下两者都可以应用:比如一堆函数作为容器的客户端,取出多态对象的指针并对其进行操作。如果容器的生命周期超过了所有函数,则可以将其替换为指针容器。

Timday通过指出列表中的遗漏来回答了“以下指针集合之间的区别是什么”的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接