可以使用对shared_ptr拥有的对象的引用吗?

时间:2019-03-24 18:58:18

标签: c++ c++11 reference c++14 shared-ptr

我发现它运行良好,但是不知道这样做是否安全,因为我不知道它为什么起作用:

struct X{
  static X& make(){
    return *std::make_shared<X>();
  }
  ...
}

int main(){
   const auto& a = X::make();
   a.function();
   ...
   // seems like the instance holds and nothing broken
}

据我所知,从shared_ptr operator*中返回的对已取消引用对象的引用不应影响shared_ptr如何管理实例的引用计数:因此在{{1}内创建的实例make()完成后应销毁}。但是这种代码模式已经运行了很多次,我不明白为什么。所以我不确定我们是否真的可以通过这种方式做到这一点……感谢任何评论!

1 个答案:

答案 0 :(得分:8)

否,从make_shared返回的共享指针在返回后立即被销毁,因此通过解引用获得的引用将悬而未决。它可能看起来像 一样有效,但实际上只是未定义的行为,正如注释中所述,未定义是未定义的。