C++ 共享\u ptr与范围\u ptr

C++ 共享\u ptr与范围\u ptr,c++,boost,shared-ptr,smart-pointers,scoped-ptr,C++,Boost,Shared Ptr,Smart Pointers,Scoped Ptr,scoped_ptr不可复制,正在从范围外删除。因此,它是一种受限的共享\u ptr。因此,除了您确实需要限制复制操作的情况外,最好使用shared\u ptr。因为有时你不知道你需要创建一个对象或No的拷贝,所以问题是:除了上面提到的情况,我们可以认为 SydDypTr> /Cult>是更好的(或推荐的)使用而不是 SimeDePPTR < /代码>。scoped_ptr是否比shared_ptr工作得更快,或者它有什么优势 谢谢 scoped_ptr比shared_ptr工作得快得多。没错共

scoped_ptr
不可复制,正在从范围外删除。因此,它是一种受限的
共享\u ptr
。因此,除了您确实需要限制复制操作的情况外,最好使用
shared\u ptr
。因为有时你不知道你需要创建一个对象或No的拷贝,所以问题是:除了上面提到的情况,我们可以认为<代码> SydDypTr> /Cult>是更好的(或推荐的)使用而不是<代码> SimeDePPTR < /代码>。
scoped_ptr
是否比
shared_ptr
工作得更快,或者它有什么优势


谢谢

scoped_ptr
shared_ptr
工作得快得多。没错<代码>共享\u ptr始终使用您的分配器或默认分配器分配内存。

它们的预期用途不同,因此,在许多情况下,“共享\u ptr与作用域\u ptr”根本不是问题。当然,当您只需要一个作用域的\u ptr时,您可以使用共享的\u ptr。但这有什么意义呢?由于涉及到所有引用计数,共享\u ptr的开销可能稍大。

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


我的建议(通常)是使用最简单的对象来满足您的需求。如果需要引用计数共享,请使用
shared\u ptr
;如果您只需要在完成单个引用后自动删除,请使用
作用域\u ptr

性能-
共享\u ptr
具有更多功能,但还需要额外分配(它也更大,但这很少有关系)

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


表达意图使用
scoped_ptr
可以更明确地说明您想要做什么。(万一你想知道——这是件好事:))。如果您做得正确,shared_ptr还将指示“此对象将超出此范围”

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

基本上,作用域的_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.
//一些封闭范围-任何由“{}”或函数设置的内容:
{
作用域_ptr ptr=新的MyObject(参数…);
}//当我们点击这个右括号时,“ptr”将删除里面的“MyObject”。
在互斥体和其他同步工具中,您更容易看到这种模式——我可以声明一个“AutoLock”,它将锁定传递给它的互斥体,然后在它删除时解锁它,从而将整个{}范围变成一个关键部分


还要注意的是,“作用域_ptr”只有在您出于某种原因不能执行像“MyObject obj(params..”这样的普通旧堆栈分配时才有意义。毕竟,它所做的是让您使用堆分配的对象,就像它是堆栈上的对象一样。与共享ptr及其表兄弟的引用计数相比,这种用例更为罕见。

Mike,我完全同意。我总是建议人们从
boost::scoped\u ptr
开始。如果需要所有权语义转移(维护单一所有权),则“升级”到
std::auto_ptr
。如果您只需要共享所有权,那么您可以使用
boost::shared\u ptr
。另外,当元素实际上不需要共享时,
Boost.ptr_容器
库是Boost::shared_ptr容器的一个很好的替代品,您可以通过使用
make_shared
allocate_shared
而不是
new
,分配对象来摆脱额外的分配@David:我基本上同意,但我会完全跳过
auto_ptr
。它不能在标准容器中安全使用,所以如果你不小心的话,它可能会引发一些令人不快的惊喜。同意,特别是当auto_ptr从c++11开始就被弃用时,不应该推荐它,相反,我要提到unique_ptr.+1来表达意图。在这种情况下,
scoped_ptr
shared_ptr
一样清晰。同样,使用
std::auto_ptr
应该表明您愿意在某个时候转移对象的所有权。