繁体   English   中英

共享指针和原始指针生命周期

[英]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_ptruse_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM