当我们 return 从函数

Is the stack frame of a function cleared, or is it left as such on the stack, when we return from the function

在网上查了很多,都说栈上的栈帧被清除(销毁),当一个函数returns。

但我怀疑,情况并非如此。

我正在并排使用汇编语言和我的 C++ 代码进行调试,从 C++ 代码来看,堆栈帧似乎没有被清除,但在 main() 调用另一个函数时被覆盖了。

我并排看了汇编代码。而且,当我们将一个值弹出回寄存器时,是否只是将堆栈中的值复制回寄存器,并且不会对堆栈采取进一步的操作。或者,是将值复制到寄存器并从堆栈中删除?

C++代码:

#include<iostream>
using namespace std;

int* MyFunc(int*);

int main() {
    int* a, b;
    b = 10;
    a = MyFunc(&b);
    return 0;
}

int* MyFunc(int* ptrB)
{
    int inta;
    inta = (*ptrB) * (*ptrB);
    return (&inta);
}

现在,当MyFunc returns &inta时,main中的a获取到inta的地址。但这很危险,因为如果调用另一个函数,将 inta 的地址分配给 a 之后 - 在该步骤之后取消引用 a(即 *a)将是未定义的。因为inta地址的内容可能会被覆盖。 看起来 inta 的地址被覆盖了。而不是MyFunc的栈帧被清除(cleaned up,emptied)的情况,当MyFuncreturns到main的时候。 我这么说是因为 *a 在它之前调用函数时可能仍会给出正确的结果。 当函数 returns 时,MyFunc 堆栈帧未被清除(清空、销毁)的假设是否正确?只是堆栈指针 (ESP) 移动到 main?

所有数据都保留在内存中。唯一更改的参数是栈顶指针 (esp) 和栈帧基址 (ebp)。栈帧是一个有点抽象的概念,它只是由这两个寄存器的值定义的。因此,esp 上方的区域是 "not visible",即使它可能包含先前堆栈帧留下的数据