Nik*_*sov 13

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

通常,智能指针用于管理对象所有权,所以这里是一个快速运行:

  • boost::scoped_ptr 将受保护对象的生命周期限制在封闭范围内,只有一个所有者.
  • 由于std::auto_ptr一次只有一个所有者,但它允许通过赋值传递所有权(作为函数参数或返回值.)
  • boost::shared_ptr通过引用计数支持共享所有权,只有当引用计数变为零时才会销毁受保护对象.这是最通用的智能指针,但也是最昂贵的,因为它遭受了一些小的开销(引用计数通过原子操作来维护,这相当昂贵.)还存在循环依赖的可能性.
  • boost::weak_ptr是一个非拥有的智能指针,可以boost::shared_ptr在运行时通过检查被保护对象是否还活着来升级.

还有一些数组变体,boost::shared_array因为C++对单个和多个对象有单独的释放函数(operator delete相对于operator delete[].)

智能指针支持资源获取初始化或RAII,这是一种提供异常安全保证的方法.

  • 事件更好 - 传递一个[const]引用:`f2(*a);`. (2认同)

Unc*_*ens 10

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

但是,如果函数只想使用托管对象,则可以考虑将引用传递给对象本身.

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

void bar(const Object& o)
{
     o.foobar();
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于,在第一种情况下,您将函数与特定的智能指针类型耦合.

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
Run Code Online (Sandbox Code Playgroud)

通常我只会传递scoped_ptr,如果打算对scoped_ptr实例本身做一些事情(例如释放或重置资源).类似地shared_ptr(例如,函数想要与其他共享指针共享资源).