将共享指针传递给函数参数 - 将它分配给局部变量的正确方法是什么

Pro*_*mer 0 c++ c++11

//header file
void SetLogger(const std::shared_ptr<A>& log);

//cpp file
void SetLogger(const std::shared_ptr<A>& log)
{
    std::shared_ptr<A>&  mLog;
    mLog = log;
}
Run Code Online (Sandbox Code Playgroud)

将shared_ptr作为函数参数传递的最佳方法是什么,以便所引用的对象的所有者船不会更改/不引用引用计数增加并且没有主体应该能够删除它接受所有者?

那么如何在函数中创建一个本地shared_ptr来说明上面的限制呢?

Caller:

SetLogger(A.get()); // A is actually a shared pointer

Header:

void SetLogger(const A& log);

CPP File:

void SetLogger(const A& log)
{
    auto mLog = std::make_shared<A>(log);
}
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 7

智能指针函数参数的经验法则是:如果没有所有权概念,请不要传递智能指针,传递指针对象

  1. 作为参考,如果它不能为null(最好是看评论)
  2. 作为指针,如果它可以为null(不要忘记检查)

在情况1中,delete对参数的任何调用都将无法编译,这可能是可取的.const对论证的进一步限定是正交的.在你的例子中:

void SetLogger(const A& log);
Run Code Online (Sandbox Code Playgroud)

像这样叫

auto a = std::make_shared<A>(/* ... */);

SetLogger(*a);
Run Code Online (Sandbox Code Playgroud)

那么如何在函数中创建一个本地shared_ptr来说明上面的限制呢?

如果你需要复制论证,确实存在所有权概念.在这种情况下,请将您的功能签名更改为

void SetLogger(std::shared_ptr<A> log);
Run Code Online (Sandbox Code Playgroud)

但是,这将增加引用计数,但如果对象由a管理std::shared_ptr,则没有合理的解决方案来保留副本而不触及引用计数(有充分的理由,这就是类的内容).