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会有什么好处?
答案 0 :(得分:1)
仅一个函数应接受std::shared_ptr
作为参数的原因是它是否需要共享或修改资源的所有权。如果没有,请不要通过std::shared_ptr
。
如果该功能肯定需要采用共享所有权,那么它应该接受std::shared_ptr
的值。如果该功能可能会或可能不会共享所有权,则只接受std::shared_ptr&
。
如果该功能未修改所有权,则将引用传递给资源,而不是std::shared_ptr
。
答案 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
可以在函数中间更改其内容(可能是嵌套调用),并且函数已准备好并想要新内容。