Joh*_*son 2 c++ stack undefined-behavior
我正在进行一些介绍性的C++练习,其中一个是:运行此代码后屏幕上会出现什么:
int& testMethod (int& a){
int c = a+a;
return c;
};
int main() {
int z = 5;
int* y = new int (testMethod(z));
int r = 25;
testMethod(r);
std::cout<<*y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
testMethod第二次调用返回的值没有被分配给变量?对于No 2,我只是想确认我对堆栈如何工作的理解,如下所示.当函数返回一个值并将值赋给变量时,计算结果首先存储在堆栈中,如retval某些内存位置,然后分配给变量,即写入另一个内存位置.然后堆栈指针向上移动(再次,根据我的理解,当指针从最大地址移动到最小地址时,堆栈的"顶部"实际上是它的"底部").但retval它仍然存在一段时间,直到它被另一条数据覆盖(这可能几乎立即发生).
第二个问题出现在我正在寻找关于SO的第一个问题的答案并找到了这个帖子,因为两个顶部(通过投票)的帖子回答不同.
如何在您的特定平台上实现自动分配是无关紧要的.你的代码确实触发了UB,而不是因为你忽略了返回值testMethod(顺便说一下,这不是一个方法),而是因为下面一行使用了它:
int* y = new int (testMethod(z));
Run Code Online (Sandbox Code Playgroud)
问题是testMethod始终返回对其局部变量的悬空引用c.使用此引用初始化动态分配的int触发器UB.
可以预见,启用警告(您应该始终这样做)会产生以下结果:
warning: reference to stack memory associated with local variable 'c' returned [-Wreturn-stack-address]
Run Code Online (Sandbox Code Playgroud)