我发现它运行良好,但是不知道这样做是否安全,因为我不知道它为什么起作用:
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()
完成后应销毁}。但是这种代码模式已经运行了很多次,我不明白为什么。所以我不确定我们是否真的可以通过这种方式做到这一点……感谢任何评论!
答案 0 :(得分:8)
否,从make_shared
返回的共享指针在返回后立即被销毁,因此通过解引用获得的引用将悬而未决。它可能看起来像 一样有效,但实际上只是未定义的行为,正如注释中所述,未定义是未定义的。