通过引用直接传递引用传递给shared_ptr有什么好处

时间:2016-08-11 23:15:19

标签: c++ c++11 reference shared-ptr smart-pointers

class myMem{};

class Test{
public:
  initMem1(myMem& mInput){/*initialize _mem1*/}
  initMem2(shared_ptr<myMem> &pmInput){/*initialize _mem2*/}

  myMem _mem1;
  shared_ptr<myMem> _mem2;
};

Test myTest;
myTest()

因此,在上面的代码中,成员属于一个类。一个成员是值类型,另一个成员是shared_ptr类型。对于班级成员来说哪种方式更好?此外,我还有初始化成员的功能。哪种方式更好?

一般来说,通过引用直接传递引用shared_ptr会有什么好处?

3 个答案:

答案 0 :(得分:1)

一个函数应接受std::shared_ptr作为参数的原因是它是否需要共享或修改资源的所有权。如果没有,请不要通过std::shared_ptr

如果该功能肯定需要采用共享所有权,那么它应该接受std::shared_ptr的值。如果该功能可能会或可能不会共享所有权,则只接受std::shared_ptr&

如果该功能未修改所有权,则将引用传递给资源,而不是std::shared_ptr

请参阅: CppCoreGuidelines: F.7R.30R.34R.35

答案 1 :(得分:1)

让我们看看你的功能。对于initmem1,代码通常看起来像

initMem1(myMem& mInput){ _mem1 = mInput; }

我们可以看到赋值运算符的调用,它通常会复制所有myMem字段。

对于initMem2,有两种情况

1)

initMem2(shared_ptr<myMem> &pmInput){
     _mem2 = pmInput;
 }

您应该使用&#39; initMem2(const shared_ptr&amp; pmInput)&#39;。这是一个很好的风格。 我们可以在这里看到快速初始化。只是链接被复制。但是你获得了所有权共享。如果您在外部更改pmInput,则_mem2也会更改。 不需要复制cunstructor。两个智能ptrs都拥有独特的对象。

2)

initMem2(const shared_ptr<myMem> &pmInput){ // of course, const
     _mem2.reset(*pmInput);
 }

您使用最初从pmInput复制的新内容创建新的shared_ptr。 您可以单独更改pmInput_mem2。但是你得到额外的&#34;新/删除电话&#34;对于这个新的shared_ptr和复制构造函数调用。

答案 2 :(得分:0)

一个用例是原始shared_ptr可以在函数中间更改其内容(可能是嵌套调用),并且函数已准备好并想要新内容。