返回一个shared_ptr的成员变量是否安全

Son*_*ong 2 c++ shared-ptr c++11

假设我有以下代码,这是我的问题的简化示例:

#include <string>
#include <iostream>
#include <memory>


class A{
  public:
  std::string name() { return "class A"; }
};

class B{
  public:
  B(){
    m_a = std::make_shared<A>();
  }

  std::shared_ptr<A> get_a() { return m_a; }

  private:
  std::shared_ptr<A> m_a;
};

std::shared_ptr<A> foo()
{
  B b;
  return b.get_a();
}

int main()
{
  auto a = foo();
  auto name = a->name();
  std::cout << name;
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这样做是否安全?作为B实例的"b"将在函数foo结束时释放.主函数中的"a"是B :: m_a的shared_ptr."b"发布后使用"a"是否安全?

提前谢谢了!

dec*_*uto 5

foo

shared_ptr<A> foo()
{
  B b;
  return b.get_a();
}
Run Code Online (Sandbox Code Playgroud)

不会返回对ab成员的引用,而是返回成员的副本(如果不是RV优化的副本); 和shared_ptra

auto a = foo();
Run Code Online (Sandbox Code Playgroud)

将A堆实例从破坏中保存到范围结束.

因此,我认为这是安全的,Bs虽然是创建者,但毕竟只是他们创建和发布的可能许多共享资产的一个用户.

换句话说 - 最后一个关灯,而不是关灯.

住在Coliru