【发布时间】:2012-06-05 07:02:47
【问题描述】:
如果我声明一个包含在共享指针中的对象:
std::shared_ptr<myClass> myClassObject(new myClass());
然后我想将它作为参数传递给方法:
DoSomething(myClassObject);
//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
arg1->someField = 4;
}
以上是否只是增加了 shared_pt 的引用计数并且一切都很酷?还是留下一个悬空指针?
你还应该这样做吗?:
DoSomething(myClassObject.Get());
void DoSomething(std::shared_ptr<myClass>* arg1)
{
(*arg1)->someField = 4;
}
我认为第二种方式可能更有效,因为它只需要复制 1 个地址(而不是整个智能指针),但第一种方式似乎更具可读性,我预计不会推动性能限制。我只是想确保它没有危险。
谢谢。
【问题讨论】:
-
const std::shared_ptr<myClass>& arg1 -
第二种方式被破坏了,如果你真的需要你的函数来共享所有权,第一种方式是惯用的。但是,
DoSomething真的需要共享所有权吗?看起来它应该只是参考... -
@SteveH :它没有,但是如果你的函数实际上不需要它们,为什么要在它的调用者上强制使用特殊的对象所有权语义呢?您的函数没有比
void DoSomething(myClass& arg1)更好的功能。 -
@SteveH :智能指针的全部目的是处理普通的对象所有权问题——如果你没有这些,你不应该首先使用智能指针。 ;-] 具体到
shared_ptr<>,您必须传递值才能实际共享所有权。 -
无关:一般来说,
std::make_shared不仅效率更高,而且safer 比std::shared_ptr构造函数还要好。
标签: c++ c++11 shared-ptr c++-faq