scoped_ptr是不能复制和能够被删除出的范围。因此,它是一种限制shared_ptr。因此,除了在案件似乎当你真的需要限制复制操作shared_ptr是更好地使用。因为有时候你不知道你需要创建对象或没有的副本。所以,问题是:除了上面提到的情况下,我们可以认为shared_ptr更好(或推荐),而不是使用scoped_ptr。从scoped_ptr是否shared_ptr工作得更快,或者它有什么优势呢?

谢谢!

有帮助吗?

解决方案

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

我的建议(一般)是使用符合您的需求最简单的对象。如果您需要引用计数的共享,使用shared_ptr;如果你只需要自动删除,一旦你使用的是单一参考完毕,使用scoped_ptr

其他提示

<强>性能 - shared_ptr具有更多的功能,而且还需要额外的分配(它也较大,但很少事项)。

[编辑]可以通过使用make_shared要避免的第二个分配,但随后weak_ptr将保持对象被销毁即使在整个整个分配,其可以是用于大型物体的问题。

意向Expresison 使用scoped_ptr你的状态更明确你想要做什么。 (如果你想知道 - 这是一个很好的事情:))。如果你这样做正确,shared_ptr的也将显示“此对象是为了生活超出了范围”

它们预期的目的是不同的,因此,在许多情况下“的shared_ptr VS scoped_ptr的”不是一个质询。当然,你可以在你需要的是一个使用scoped_ptr使用一个shared_ptr。但是,这有什么意义? shared_ptr的有可能与所有的引用计数涉及一个稍大一点的开销。

scoped_ptr工作快得多从shared_ptr。这是正确的。 shared_ptr使用分配器或缺省分配器总是分配内存。

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.

您倾向于把此图案更具有互斥和其他同步primatives-我可以声明“自动锁”,将锁定传给它的互斥,然后解锁它时,它删除把整个“{}”的范围为临界区。

还要注意的是一个“scoped_ptr的”永远只能是有道理的,当你不能只是做像一个普通老式的堆栈分配“为MyObject OBJ(PARAMS ..)”出于某种原因。毕竟,你用什么做的是让一个堆分配对象,如果它是一个堆栈。这往往是很多罕见的使用情况比的shared_ptr&及其同类的引用计数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top