如果我返回一个指针会发生什么

What happens if I return a pointer?

本文关键字:指针 什么 一个 返回 如果      更新时间:2023-10-16

显然,我更愿意使用std::shared_ptr<T>std::unique_ptr<T>,但我正在处理98/03中的一些遗留代码。

我的情况是:

auto* SomeClass::ReturnPtr( void )
{
    return this -> UniquePtrObject.get( );
};

如果我这样做会发生什么:

SomeObject.ReturnPtr( ) -> SomeFunction( );

临时指针是否会自动删除?还是我真的造成了泄漏?

这让我想到了一个类似Rvalue指针的表达式。Rvalue指针没有意义,是吗?

使用

auto* SomeClass::ReturnPtr()
{
    return this->UniquePtrObject.get();
}

只要是UniquePtrObject(或对其执行任何reset),指针就有效。

因此SomeObject.ReturnPtr()->SomeFunction()是有效的。

但以下将使指针悬空:

auto* createDanglingPointer()
{
    SomeClass SomeObject = MakeSomeClass();
    return SomeObject.ReturnPtr();
}

因为someObject的生存期在作用域的末尾结束。

临时指针非常危险。每当它之前指向的数据范围结束时,它就会被释放,这样指针就会悬空,并试图访问程序无法访问的某个随机位置。它可能会给您错误的结果,值或程序可能会因异常非法访问而终止。

相关文章: