shared_ptr vs scoped_ptr

Nar*_*rek 36 c++ boost smart-pointers shared-ptr scoped-ptr

scoped_ptr不能复制,并且正在删除范围之外.所以它有点受限制shared_ptr.因此,除了您真正需要限制复制操作的情况之外,shared_ptr最好使用.因为有时您不知道需要创建对象的副本或不需要.所以问题是:除了上面提到的情况之外,我们shared_ptr是否可以考虑使用更好(或推荐)代替scoped_ptr.是否scoped_ptr更快地工作shared_ptr,或者它有什么优势?

谢谢!

Mik*_*our 69

shared_ptr比重量级更重要scoped_ptr.它需要分配和释放引用计数对象以及托管对象,并处理线程安全引用计数 - 在我工作的一个平台上,这是一个重要的开销.

我的建议(一般)是使用满足您需求的最简单的对象.如果您需要参考计数共享,请使用shared_ptr; 如果您在完成单个参考后只需要自动删除,请使用scoped_ptr.

  • @David:我大多同意,但我完全跳过`auto_ptr`.它不能在标准容器中安全使用,所以如果你不小心的话,它可能会产生一些令人讨厌的惊喜. (17认同)
  • 迈克,我完全同意.我总是建议人们从`boost :: scoped_ptr`开始.如果您需要转移所有权语义(维护单一所有权),那么"升级"到`std :: auto_ptr`.如果您只需要共享所有权,那么您使用`boost :: shared_ptr`.此外,当不需要共享元素时,`Boost.ptr_container`库是boost :: shared_ptr容器的一个很好的替代品. (16认同)
  • 这个A应该更新为提及c ++ 11 unique_ptr吗? (5认同)
  • 顺便说一句:如果你确实需要共享指针,你可以通过使用`make_shared`或`allocate_shared`而不是`new`来分配对象来摆脱额外的分配. (2认同)

pet*_*hen 16

性能 - shared_ptr具有更多功能,但也需要额外的分配(它也更大,但这很少重要).

[edit]通过使用可以避免第二次分配make_shared,但是weak_ptr即使在对象被销毁之后也会保留整个分配,这对于大型对象可能是个问题.

使用scoped_ptr的意图表达更明确地说明您想要做什么.(万一你想知道 - 这是一件好事:)).如果您正确执行此操作,shared_ptr还将指示"此对象旨在超出此范围"

  • 用于表达意图的+1.在那种情况下,`scoped_ptr`和`shared_ptr`一样非常清楚.同样,使用`std :: auto_ptr`应该表示您愿意在某个时刻转移对象的所有权. (3认同)

sel*_*tze 6

它们的预期目的不同,因此,在许多情况下,"shared_ptr vs scoped_ptr"根本不是问题.当然,当你需要的只是一个scoped_ptr时,你可以使用shared_ptr.但重点是什么?shared_ptr可能涉及所有引用计数的稍大开销.