可以使用对 shared_ptr 拥有的对象的引用吗?
Is it OK to use reference to the object owned by a 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
管理实例引用计数的方式:所以在 make()
应该在 make()
完成后销毁。但是这种代码模式多次运行良好,我不明白为什么。所以我不确定我们是否真的可以用这种方式做到...感谢任何评论!
不,从 make_shared
编辑的共享指针 return 在 return 之后立即销毁,因此通过取消引用它获得的引用将是悬空的。它可能 看起来 好像有效,但它实际上只是未定义的行为,正如评论中所说,未定义是未定义的。
我发现它运行良好,但不知道这是否安全,因为我不明白它为什么起作用:
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
管理实例引用计数的方式:所以在 make()
应该在 make()
完成后销毁。但是这种代码模式多次运行良好,我不明白为什么。所以我不确定我们是否真的可以用这种方式做到...感谢任何评论!
不,从 make_shared
编辑的共享指针 return 在 return 之后立即销毁,因此通过取消引用它获得的引用将是悬空的。它可能 看起来 好像有效,但它实际上只是未定义的行为,正如评论中所说,未定义是未定义的。