C++ 通过引用(从一个类中的一个方法传递到另一个方法)传递作用域的_ptr是一种好的做法吗?

C++ 通过引用(从一个类中的一个方法传递到另一个方法)传递作用域的_ptr是一种好的做法吗?,c++,pass-by-reference,shared-ptr,scoped-ptr,C++,Pass By Reference,Shared Ptr,Scoped Ptr,或者如果我需要这样做,那么我应该只使用shared\u ptr?如果被调用方不需要存储包装的指针,而只是使用它来调用某些方法,那么通过引用传递范围的\u ptr是安全的。scoped_ptr保护的对象在超出范围时将被销毁-如果指针是堆栈变量,则在调用函数的末尾销毁;如果包含的类实例是成员变量,则在释放时销毁 一般来说,智能指针用于管理对象所有权,因此这里有一个简要说明: boost::scoped_ptr将受保护对象的生存期限制在封闭范围内,只有一个所有者。 使用std::auto_ptr时,

或者如果我需要这样做,那么我应该只使用shared\u ptr?

如果被调用方不需要存储包装的指针,而只是使用它来调用某些方法,那么通过引用传递
范围的\u ptr
是安全的。
scoped_ptr
保护的对象在超出范围时将被销毁-如果指针是堆栈变量,则在调用函数的末尾销毁;如果包含的类实例是成员变量,则在释放时销毁

一般来说,智能指针用于管理对象所有权,因此这里有一个简要说明:

  • boost::scoped_ptr
    将受保护对象的生存期限制在封闭范围内,只有一个所有者。
  • 使用
    std::auto_ptr
    时,一次也只有一个所有者,但它允许通过赋值传递所有权(作为函数参数或返回值)
  • boost::shared_ptr
    通过引用计数支持共享所有权,只有当引用计数为零时,受保护对象才会被销毁。这是最通用的智能指针,但也是最昂贵的,因为它有一些较小的开销(引用计数是通过原子操作维护的,这相当昂贵。)还有循环依赖的可能性。
  • boost::weak_ptr
    是一个非自有智能指针,可以在运行时升级到
    boost::shared_ptr
    ,并检查受保护对象是否仍处于活动状态。
<> P>也有数组变体,如:代码> Boo::SyrdIdAdxs/CODE >,因为C++对单个和多个对象有单独的解除分配功能(<代码>操作符删除< /COD> vs.代码>操作符删除[]/COD>)


智能指针支持习惯用法或RAII,这是提供的一种方式。

是的,您可以通过引用传递它

但是,如果函数只想使用托管对象,您可以考虑传递对对象本身的引用。

void foo(const boost::scoped_ptr<Object>& o)
{
     o->foobar();
}

void bar(const Object& o)
{
     o.foobar();
}
void foo(const boost::scoped_ptr&o)
{
o->foobar();
}
空栏(常量对象和o)
{
o、 foobar();
}
区别在于,在第一种情况下,您将函数与特定的智能指针类型耦合

Object o;
boost::scoped_ptr<Object> scoped(new Object);
boost::shared_ptr<Object> shared(new Object);

foo(o);  //no
foo(scoped); //OK
foo(shared); //no

bar(o);  //OK
bar(*scoped); //OK
bar(*shared); //OK
对象o;
boost::scoped_ptr scoped(新对象);
boost::shared_ptr shared(新对象);
富(o),//不
foo(范围)//好啊
foo(共享)//不
巴(o)//好啊
条形图(*范围)//好啊
酒吧(*共享)//好啊

通常,如果打算对
范围内的ptr
实例本身做一些事情(例如释放或重置资源),我只会传递
范围内的ptr
。类似地,对于
共享\u ptr
(例如,函数希望与其他共享指针共享资源)

就我个人而言,我几乎在所有地方都通过const引用传递共享ptr。正如其他人所说,如果调用函数并传递常量引用,那么调用方几乎肯定会将共享的ptr保留在范围内


真正的好处是这样可以节省更新引用计数器的成本。快速阅读wiki,您将了解到不断在引用计数器上执行+1/-1(可能是原子)操作可能会破坏缓存

您认为将指针本身传递给另一个方法可以吗?我的意思是:如果在f1中我分配了共享的ptr a(新的a()),那么这样做是好的做法:f2(a.get())。当然,f2在此处接收指向事件的指针。事件最好传递一个[const]引用:
f2(*A)我的意思是
T&运算符*()常数
范围\u ptr