共享指针和原始指针生命周期
shared pointer and raw pointer lifetime
有人可以简单地解释一下这不起作用的原因吗:
std::shared_pointer<Bar> getSharedPointer() {
return std::make_shared<Bar>();
}
...
auto foo = getSharedPointer().get();
显然使用原始指针 foo
会导致段错误,因为 getSharedPointer()
返回的共享指针的生命周期将 运行 结束。不知怎的,我希望它能持续到它的范围结束(就像它在里面的任何块一样)。
这是否正确,是否有与此情况类似的示例?
对于getSharedPointer().get();
,getSharedPointer()
returns一个临时的std::shared_ptr
,在表达式后立即销毁,其管理的指针也将被删除。在那之后 foo
将变得悬空,对它的任何取消引用都会导致 UB。
auto foo = getSharedPointer().get();
// foo have become dangled from here
您可以改用命名变量:
auto spb = getSharedPointer();
auto foo = spb.get();
// It's fine to use foo now, but still need to note its lifetime
// because spb will be destroyed when get out of its scope
// and the pointer being managed will be deleted too
auto foo = getSharedPointer().get();
只要函数 returns 不是引用的类型,调用该函数的结果就是右值。还有,因为函数getSharedPointer()
returns是class类型,结果是一个临时对象
该临时对象的生命周期定义为最外层表达式求值的结束,此处 getSharedPointer().get()
。 foo
变量一初始化,拥有的智能指针就被销毁;当拥有该对象的最后一个 shared_ptr
被销毁时,该对象将被删除。
这里 getSharedPointer()
总是 returns shared_ptr
不共享托管对象(use_count()
是 1),所以当最后一个副本 shared_ptr
被销毁,对象被销毁,指向对象的指针无效。
(我不确定你为什么在这里返回 shared_ptr
而不是 unique_ptr
。)
正确使用智能指针,或任何 class "owns"(控制生命周期)其他资源(您仍然可以直接访问的资源),是为了保持"smart" pointer/owner 只要您需要访问资源就一直活着。
所以"smart"指针(所属对象)需要命名。另外,我不确定您是否真的想从 reader 和 auto
.
的视图中隐藏它是一个智能指针这一事实
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
您可能想要隐藏托管对象的确切类型:
std::shared_pointer<auto> foo = getSharedPointer();
有人可以简单地解释一下这不起作用的原因吗:
std::shared_pointer<Bar> getSharedPointer() {
return std::make_shared<Bar>();
}
...
auto foo = getSharedPointer().get();
显然使用原始指针 foo
会导致段错误,因为 getSharedPointer()
返回的共享指针的生命周期将 运行 结束。不知怎的,我希望它能持续到它的范围结束(就像它在里面的任何块一样)。
这是否正确,是否有与此情况类似的示例?
对于getSharedPointer().get();
,getSharedPointer()
returns一个临时的std::shared_ptr
,在表达式后立即销毁,其管理的指针也将被删除。在那之后 foo
将变得悬空,对它的任何取消引用都会导致 UB。
auto foo = getSharedPointer().get();
// foo have become dangled from here
您可以改用命名变量:
auto spb = getSharedPointer();
auto foo = spb.get();
// It's fine to use foo now, but still need to note its lifetime
// because spb will be destroyed when get out of its scope
// and the pointer being managed will be deleted too
auto foo = getSharedPointer().get();
只要函数 returns 不是引用的类型,调用该函数的结果就是右值。还有,因为函数getSharedPointer()
returns是class类型,结果是一个临时对象
该临时对象的生命周期定义为最外层表达式求值的结束,此处 getSharedPointer().get()
。 foo
变量一初始化,拥有的智能指针就被销毁;当拥有该对象的最后一个 shared_ptr
被销毁时,该对象将被删除。
这里 getSharedPointer()
总是 returns shared_ptr
不共享托管对象(use_count()
是 1),所以当最后一个副本 shared_ptr
被销毁,对象被销毁,指向对象的指针无效。
(我不确定你为什么在这里返回 shared_ptr
而不是 unique_ptr
。)
正确使用智能指针,或任何 class "owns"(控制生命周期)其他资源(您仍然可以直接访问的资源),是为了保持"smart" pointer/owner 只要您需要访问资源就一直活着。
所以"smart"指针(所属对象)需要命名。另外,我不确定您是否真的想从 reader 和 auto
.
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
您可能想要隐藏托管对象的确切类型:
std::shared_pointer<auto> foo = getSharedPointer();