一个基本问题,我不确定答案。以下函数是否有效?
std::vector<int> & test_function() {
std::vector<int> x;
// do whatever
return x;
}
如果是这样,为什么?函数返回后,程序不应该从堆栈中删除x吗?感谢。
答案 0 :(得分:11)
行为未定义。您不应该返回对局部变量的引用。
答案 1 :(得分:9)
该函数格式正确(语法正确),但只要函数返回,返回的引用就无效,无法使用。
澄清一下:有问题的代码不会调用任何未定义的行为。只要不使用返回值,就可以安全地调用此函数,例如,这是有效的:
test_function(); // ok
但是,如果您尝试使用返回值(即,使用它初始化另一个引用或将引用对象复制到另一个对象),那么您将调用未定义的行为,因为引用的生命周期(对象x
)将结束(x
将在函数返回时被销毁,因为它是一个自动变量):
std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function(); // undefined
答案 2 :(得分:2)
是的,它是有效的,但如果您尝试使用返回的值,您将得到未定义的行为。
答案 3 :(得分:0)
由于无法返回指向局部变量的指针,因此无法返回对局部变量的引用,因为从函数返回时,这些局部变量将被释放,因此引用或指针变为无效。