c++ - boost::ptr_container 和 std::vector<shared_ptr>

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

看完timdays answerthis 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/

相关文章:

c++ - 使用模板参数作为 lambda 的参数进行参数化

Delphi - 如何释放属于 2 个(或更多)列表的对象

c++ - C++多线程中的锁和条件变量问题

C++1z Coroutines 是一种语言特性吗?

C 编程 - 将未声明的字符串传递给函数(内存分配)

c++ - C 或 C++ 中的任何可克隆对象池实现?

c++ - 关闭 "' 寄存器的存储类说明符已弃用“警告

c++ - vector 的最后一项不显示/vector 索引问题

c++ - 编码时如何获取我的自定义函数执行地址?

python - 使用 file/db 作为非常大的 numpy 数组的缓冲区来生成数据以防止溢出?