2010-11-04 246 views
0

如何清理堆栈...C++中的清除堆栈

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

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

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

现在,如果我们使用return与声明比这是干净的堆栈..我的意思是返回语句,如果条件是用来清理堆栈..是吗?

回答

3

是的,只要函数通过执行'return XXXX'返回,相关函数的堆栈框就会被移除。本地自动存储持续时间对象在此过程中被销毁。此外,它可能涉及某些CPU寄存器的操作(例如,英特尔上的ESP,EBP),并且是特定于实现的行为。如果返回语句在一个条件或在其上返回

EDIT 2的值执行不要紧:

在下面的代码,本地对象“S”(其具有自动存储持续时间)被销毁。本地对象'p'和'x'也被销毁,但'new'指向的内存不会自动删除,直到完全删除完成(使用delete)。所有这一切发生时,不论在功能“F”通过返回的“返回true”或“返回false”

struct S{}; 
bool f(int x){ 
    S s; 
    S *p = new S; 
    if(x == 2) return true; 
    else return false; 
} 
+0

好,但如果我说如果(m1.high_ [0] Model 2010-11-04 03:01:23

+0

请记住,你用new分配的任何内存仍然会被占用,除非你在'return'之前明确地'删除'它。 – 2010-11-04 03:02:07

+1

如果堆栈必须清理干净,否则错误或真实并不表明事实。从函数返回涉及清理被调用函数的堆栈帧,而不考虑函数返回的值。 – Chubsdad 2010-11-04 03:03:47

4

你不是真的“干净”的堆栈。所发生的只是堆栈指针被重置为调用程序堆栈存储的顶部。

任何从这个程序中调用后续功能将被赋予相同的堆栈指针为你的程序receieved(包括你的程序设置的任何值 - 这就是为什么它的重要intialise自动存储)

Conversly当你程序调用一个函数,被调用的函数将被赋予一个堆栈指针,它位于堆栈的最后一块之后,如果你调用了多个函数,它们将以相同的堆栈指针结束。


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

“静态”,这是全球用途不同的编译单元。当主程序启动时,分配一个合适的存储块,每个“静态”在这个块中分配一个地址。直到主程序终止时才使用它。

“堆”这是一个由“malloc”管理的存储区的集合,在底层操作系统的帮助下。大多数(但不是全部!)“新”对象通过这种方式来存储内存。

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

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

+0

这是我正确的答案。 – Anthony 2010-11-04 03:41:30

+0

@詹姆斯:在你的声明中,它似乎是堆栈保留所有地球和局部变量以及所有这些东西..但是内存清理实际上发生在堆栈指针中..我们给出指针我的意思是说让int * a =&b现在在这里一个指向int的指针,但是如果我不给指针而不是这个变量不会被删除。是吗 ?与您的声明我jsut coem知道这..实际上什么是堆栈..堆栈是内存位置现在什么si指针指向堆栈的位置,所以如果我不使用指针比我的变量不会删除控制出去从功能。是吗? – Model 2010-11-04 04:24:27

+0

这是正确的一个警告......他似乎也在寻找返回值的存储位置。至少在X86-32上,如果它适合存储在EAX中(即指针,int32,int16,int8等),但是......浮点值在浮点堆栈顶部返回。关于我的头脑,我不记得X86-64的惯例,也没有X86-32的约定,当某些东西太大而不适合EAX时。 – JimR 2010-11-04 04:32:45