我发现这个方法运作良好,但不知道这个方法是否安全,因为我不明白为什么会这样:

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

最佳答案

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

09-04 18:13
查看更多