shared_ptr vs scoped_ptr

时间:2009-11-20 14:07:11

标签: c++ boost shared-ptr smart-pointers scoped-ptr

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

谢谢!

5 个答案:

答案 0 :(得分:69)

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

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

答案 1 :(得分:16)

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

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

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

答案 2 :(得分:6)

他们的预期目的不同,因此,在许多情况下,“shared_ptr vs scoped_ptr”根本不是问题。当然,当你需要的只是一个scoped_ptr时,你可以使用shared_ptr。但重点是什么? shared_ptr可能会略微增加所有引用计数的开销。

答案 3 :(得分:3)

scoped_ptrshared_ptr开始工作得更快。这是正确的。 shared_ptr始终使用分配器或默认分配器分配内存。

答案 4 :(得分:1)

Scoped_ptr与shared_ptr,weak_ptr或unique_ptr几乎没有共同之处,因为它只是做了“引用计数”的非常特殊的情况。在精心设计的代码中,这不是经常需要的东西,但它是一个很好的工具。

基本上,scoped_ptr根本不是引用计数的东西。相反,它是您在堆栈上创建的对象(在本地范围内),以便您可以执行以下操作:

  //Some enclosing scope- anything set off by "{}" or even a function:
   {
       scoped_ptr<MyObject> ptr = new MyObject( parameters...);
   } // When we hit this closing brace, "ptr" will delete the "MyObject" inside.

你倾向于使用互斥锁和其他同步灵感来更多地看到这种模式 - 我可以声明一个“AutoLock”来锁定传入其中的互斥锁,然后在删除它时将其解锁以将整个“{}”范围转换为关键部分。

另外请注意,当你出于某种原因无法像“MyObject obj(params ..)”那样进行普通的堆栈分配时,'scoped_ptr'才有意义。毕竟,它正在做的是让你使用堆分配的对象,就好像它是堆栈中的对象一样。这个用例往往比shared_ptr&amp;的引用计数更少见。它的堂兄弟。