不将函数的返回值赋给变量的含义

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)

我的问题是:

  1. 我是对的,这是UB的一个例子,因为testMethod第二次调用返回的值没有被分配给变量?
  2. 返回值虽然没有分配给变量,但仍然可以恢复,但它取决于是吗?

对于No 2,我只是想确认我对堆栈如何工作的理解,如下所示.当函数返回一个值并将值赋给变量时,计算结果首先存储在堆栈中,如retval某些内存位置,然后分配给变量,即写入另一个内存位置.然后堆栈指针向上移动(再次,根据我的理解,当指针从最大地址移动到最小地址时,堆栈的"顶部"实际上是它的"底部").但retval它仍然存在一段时间,直到它被另一条数据覆盖(这可能几乎立即发生).

第二个问题出现在我正在寻找关于SO的第一个问题的答案并找到了这个帖子,因为两个顶部(通过投票)的帖子回答不同.

Que*_*tin 5

如何在您的特定平台上实现自动分配是无关紧要的.你的代码确实触发了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)