2010-11-04 247 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