[英]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()
返回一个临时的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();
每当一个函数返回一个不是引用的类型时,调用该函数的结果就是一个右值。 此外,因为函数getSharedPointer()
返回一个类类型,所以结果是一个临时对象。
该临时对象的生命周期被定义为最外层表达式的计算结束,这里是getSharedPointer().get()
。 一旦foo
变量被初始化,拥有的智能指针就会被销毁; 当最后一个拥有该对象的shared_ptr
被销毁时,该对象将被删除。
这里getSharedPointer()
总是返回不共享托管对象的shared_ptr
( use_count()
为 1),因此当最后一个shared_ptr
副本被销毁时,该对象被销毁并且指向该对象的指针无效。
(我不确定你为什么在这里返回shared_ptr
而不是unique_ptr
。)
正确使用智能指针或任何“拥有”(控制其生命周期)其他资源(您仍然可以直接访问的资源)的类,是让“智能”指针/所有者保持活动状态,只要您需要访问资源。
因此需要命名“智能”指针(拥有对象)。 另外,我不确定您是否真的想隐藏它是带有auto
的阅读器视图中的智能指针这一事实。
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
您可能想要隐藏托管对象的确切类型:
std::shared_pointer<auto> foo = getSharedPointer();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.