用c ++清理堆栈

时间:2010-11-04 02:50:52

标签: c++

我们如何清理堆栈......

return语句用于从函数中输出。现在

if (m1.high_[0] < m2.low_[0]) return FALSE;

这里有m1和m2两个点,高[0],低[0],低[1]和高[1]值..

现在如果我们使用return with语句而不是这个清理堆栈..我的意思是返回语句if if条件用于清理堆栈..是吗?

2 个答案:

答案 0 :(得分:4)

你真的没有“清理”堆栈。所有发生的事情是堆栈指针被重置为调用程序堆栈存储的顶部。

从该程序调用的任何后续函数都将获得与您收到的程序相同的堆栈指针(包括程序设置的任何值 - 这就是为什么它对初始化自动存储非常重要!)

相反,当你的程序调用一个函数时,被调用的函数将被赋予一个堆栈指针,它位于堆栈的最后一段之后,并且,如果你调用多个函数,它们将最终得到相同的堆栈指针。 / p>


澄清C C ++程序支持三种类型的存储分配: -

“静态”,它对编译单元有效。当主程序启动时,分配一个合适的存储块,并且每个“静态”在这个存储块中分配一个地址。在主程序终止之前使用。

“heap”这是由“malloc”管理的存储区域的集合,只是来自底层操作系统的一些帮助。大多数(但不是全部!)“新”对象以这种方式对内存进行了修改。

然后“自动”存储(默认情况下)使用堆栈。同样,这是主程序启动时分配的相当大的连续存储区域。 “main”使用的任何自动变量将被分配到堆栈的开头,并且堆栈指针递增以指向main的最后一个变量结束之后的单词。 当调用第一个函数时,它从当前堆栈指针开始分配自动变量,并且在最后一个变量结束后将stck指针设置为单词,如果调用其他函数则重复该过程。当函数结束时,堆栈指针被重置为调用函数时的值。

通过这种方式,不需要任何mallocs或frees就可以不断地重用存储,并且它可以很容易地实现递归函数,因为每次调用都会得到它自己的堆栈(直到堆栈耗尽!)。

答案 1 :(得分:3)

是的,每当函数通过执行'return XXXX'返回时,相关函数的堆栈帧将被删除。在此过程中销毁本地自动存储持续时间对象。此外,它可能涉及操纵某些CPU寄存器(例如英特尔的ESP,EBP),并且是特定于实现的行为。返回语句是在条件中还是在返回的值上执行无关紧要

编辑2:

在下面的代码中,本地对象的'(具有自动存储持续时间)被销毁。本地对象'p'和'x'也被销毁,但是'p'所指向的内存在自动删除之前不会自动删除(使用删除)。无论函数'f'何时通过'return true'或'return false'返回

,所有这一切都会发生
struct S{};
bool f(int x){
   S s;
   S *p = new S;
   if(x == 2) return true;
   else return false;
}