看完timdays answer至 this question我很好奇 boost::ptr_container
之间的区别和一个 std::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>
的目的非常不同时.
最佳答案
你是对的,两者有很大的不同。
如您所见,第一个区别是所有权语义。指针容器中项目的所有权是不共享的。在这方面,boost::ptr_vector<T>
更接近 std::vector<std::unique_ptr<T>>
.
但这不是唯一的区别!
- 除非在类型中明确说明,否则指针容器将不包含任何空指针
- 指针容器具有深层复制语义(使用
new_clone
方法),并且只有在持有的对象可复制时才能复制 - 指针容器具有深层的 const 语义,也就是说,如果容器是
const
那么一个人不能改变它的元素之一。
至于为什么@timday
不得不提到 Boost Pointer Container,我认为这是因为他想稍微扩大这个问题。 Boost 指针容器非常类似于可以容纳多个对象的智能指针,并提供比一般指针容器更好的语法。
关于他与 std::vector< boost::shared_ptr<T> >
的比较我认为这仅仅是因为这是在没有移动语义的情况下实现指针 vector 的传统方法(没有 unique_ptr
)自 auto_ptr
以来不能在 STL 容器中使用。大多数时候人们只是不知道指针容器...
关于c++ - boost::ptr_container 和 std::vector<shared_ptr>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836575/