boost :: scoped_ptr <T>和std :: unique_ptr <T>之间的区别

mos*_*ear 55 c++ unique-ptr scoped-ptr

唯一的区别是移动语义boost::scoped_ptr<T>和移动语义std::unique_ptr<T>的事实,std::unique_ptr<T>boost::scoped_ptr<T>只是一个获取/重置智能指针?

Nic*_*las 44

不,但这是最重要的区别.

另一个主要区别是unique_ptr可以有一个析构函数对象,类似于如何shared_ptr.与shared_ptr析构函数类型不同,它是类型的一部分unique_ptr(分配器是STL容器类型的一部分).

  • @moshbear:我会说功能链是"不再使用`scoped_ptr`了." `unique_ptr`可以做`scoped_ptr`可以做的所有事情.`const unique_ptr`是`scoped_ptr`,但更好.所以,除非编译器不支持`unique_ptr`,否则使用`scoped_ptr`是没有意义的.您拥有的指针模板越少越好. (10认同)
  • @MichaelPrice:`unique_ptr`不需要完全定义的类型.`unique_ptr`的析构函数.`scoped_ptr`的析构函数也是如此.如果你使一个成为一个类的成员,你可以给该类一个析构函数,该析构函数是在.cpp文件而不是标题中实现的. (9认同)
  • 迈克尔,`unique_ptr`不需要完全定义的类型 - 只有构造函数/析构函数.这使它可用于pimpl. (6认同)
  • @NicolBolas 也许你可以改变你对`unique_ptr` 接受不完整类型的评论,而`const unique_ptr` 是更好的`scoped_ptr` 来回答你的问题。在看到评论之前,我正准备将其添加为对您的答案的修正。我认为这些都是非常重要的事实。无论如何,很好的答案。 (2认同)

Alo*_*ave 28

unique_ptr拥有一个对象.它是不可复制的,但支持所有权转让.它被引入作为现已弃用的替代品auto_ptr.

scoped_ptr没有可复制也不可移动.当你想要确保指针在超出范围时被删除时,它是首选.

  • 当你想确保在范围的末尾删除指针时,我认为首选的选择是`unique_ptr <T> const`. (29认同)
  • 有点晚了,但我认为scoped_ptr确实传达了必须在scope_extr上删除ptr而不是unique_ptr的意图.unique_ptr可以移出范围. (8认同)
  • @BrandonKohn:scoped_ptr 支持“swap”,因此它也可以逃脱作用域。(实际上我不知道为什么scoped_ptr禁止移动但允许交换;这似乎是设计中的不一致。) (2认同)