scoped_ptr
无法复制,并且正在删除范围之外。所以它有点受限shared_ptr
。因此,除了您确实需要限制复制操作shared_ptr
的情况之外,最好使用。因为有时您不知道需要创建对象的副本或不需要。所以问题是:除了上面提到的情况之外,我们是否可以考虑使用shared_ptr
代替scoped_ptr
更好(或推荐)。 scoped_ptr
shared_ptr
的工作速度是否更快,或者它有什么优势?
谢谢!
答案 0 :(得分:69)
shared_ptr
比scoped_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_ptr
从shared_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;的引用计数更少见。它的堂兄弟。