38

scoped_ptr不可复制,正在从范围中删除。所以它是一种限制shared_ptr。因此,除了确实需要限制复制操作的情况外,似乎shared_ptr更好用。因为有时您不知道是否需要创建对象的副本。所以问题是:除了上面提到的情况外,我们是否可以认为shared_ptr更好(或推荐)使用而不是scoped_ptr. 是否scoped_ptr工作得更快shared_ptr,或者它有什么优势?

谢谢!

4

5 回答 5

72

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

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

于 2009-11-20T14:14:42.420 回答
16

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

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

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

于 2009-11-20T14:20:40.030 回答
6

它们的预期目的不同,因此,在许多情况下,“shared_ptr vs scoped_ptr”根本不是问题。当然,当您只需要一个 scoped_ptr 时,您可以使用 shared_ptr。但有什么意义呢?shared_ptr 的开销可能会稍大一些,涉及到所有引用计数。

于 2009-11-20T14:10:20.987 回答
3

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

于 2009-11-20T14:09:38.980 回答
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”,它将锁定传递给它的互斥锁,然后在它删除时解锁它,将整个“{}”范围变成一个关键部分。

另请注意,“scoped_ptr”只有在您出于某种原因不能像“MyObject obj(params..)”这样的普通堆栈分配时才有意义。毕竟,它所做的是让您使用堆分配的对象,就好像它是堆栈上的对象一样。与 shared_ptr 及其表亲的引用计数相比,这往往是一个更罕见的用例。

于 2014-08-01T21:29:44.350 回答