gpt4 book ai didi

c++ - 在 C++ 中返回对局部变量的引用

转载 作者:IT老高 更新时间:2023-10-28 11:55:25 25 4
gpt4 key购买 nike

如果必须返回 i,以下代码 (func1()) 是否正确?我记得在某处读到返回对局部变量的引用时出现问题。它与 func2() 有何不同?

int& func1()
{
int i;
i = 1;
return i;
}

int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}

最佳答案

这段代码片段:

int& func1()
{
int i;
i = 1;
return i;
}

将不起作用,因为您要返回一个对象的别名(引用),该对象的生命周期仅限于函数调用的范围。这意味着一旦 func1() 返回,int i 就会死掉,使得从函数返回的引用毫无值(value),因为它现在引用了一个不存在的对象。

int main()
{
int& p = func1();
/* p is garbage */
}

第二个版本确实有效,因为变量是在自由存储区分配的,它不受函数调用的生命周期的约束。但是,您有责任删除分配的int

int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}

int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}

通常你会将指针包裹在一些 RAII 中。类和/或工厂函数,因此您不必自己delete

在任何一种情况下,您都可以只返回值本身(尽管我意识到您提供的示例可能是人为的):

int func3()
{
return 1;
}

int main()
{
int v = func3();
// do whatever you want with the returned value
}

请注意,返回大对象的方式与 func3() 返回原始值的方式相同,因为现在几乎每个编译器都实现了某种形式的 return value optimization。 :

class big_object 
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};

big_object func4()
{
return big_object(/* constructor arguments */);
}

int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}

有趣的是,将临时绑定(bind)到 const 引用是 perfectly legal C++ .

int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}

关于c++ - 在 C++ 中返回对局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com