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

use*_*391 9 c++ stack function

一个基本问题,我不确定答案.以下功能是否有效?

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

   // do whatever

   return x;
}
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*lin 11

行为未定义.您不应该返回对局部变量的引用.


Jam*_*lis 9

函数格式正确(语法正确),但只要函数返回,返回的引用就无效,无法使用.

澄清一下:有问题的代码不会调用任何未定义的行为.只要不使用返回值,就可以安全地调用此函数,例如,这是有效的:

test_function(); // ok
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试使用返回值(即,使用它初始化另一个引用或将引用对象复制到另一个对象),那么您将调用未定义的行为,因为引用对象(对象x)的生命周期将结束(x将在函数返回,因为它是一个自动变量):

std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function();  // undefined
Run Code Online (Sandbox Code Playgroud)