c ++返回引用/堆栈内存

时间:2010-07-15 03:41:30

标签: c++ function stack

一个基本问题,我不确定答案。以下函数是否有效?

std::vector<int> & test_function() {
   std::vector<int> x;

   // do whatever

   return x;
}

如果是这样,为什么?函数返回后,程序不应该从堆栈中删除x吗?感谢。

4 个答案:

答案 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)

由于无法返回指向局部变量的指针,因此无法返回对局部变量的引用,因为从函数返回时,这些局部变量将被释放,因此引用或指针变为无效。