2012-02-02 64 views
2

如果我在函數內部聲明數組,內存是否在離開函數時解除分配?我不會這麼想,但是,當我在函數內部聲明一個數組時,將指向數組的指針寫入全局變量,然後嘗試(在函數外部)將指針取消引用到數組,我得到一個內存訪問衝突。如果我在函數中使用相同的代碼,我不會遇到內存訪問衝突。C++ - 聲明數組內函數

澄清將不勝感激。

在此先感謝。

回答

2

在函數中聲明的數組被分配到程序堆棧中。當程序退出該函數時,堆棧中的局部變量將被彈出,並且包含陣列的內存不再可用。替代方案是新的一個數組指針,它在程序堆上分配,將會在函數退出時生存下來,並且隨後必須被刪除'd或者會發生內存泄漏。

對程序堆棧的一個相當一般的解釋是爲保留函數的局部變量而留出的一塊內存。當一個函數被調用時,保存函數局部變量所需的內存量被壓入堆棧的頂部,即堆棧指針向上移動該量。當函數退出時,會從堆棧的頂部彈出確切數量的內存,並且在函數調用之前,堆棧指針將向下移回其之前的位置。另一方面,程序堆是不具有堆棧語義的內存,當函數請求內存塊時使用。該程序然後負責管理該內存的重新分配。

Smart pointers通常用於C++自動處理內存的分配和釋放以避免與內存管理相關的錯誤/內存泄漏。

一個快速的谷歌扔了this explanation of stack versus heap in C++

+0

非常感謝!我們在一個工程編程課程中被簡單地介紹過堆棧和堆棧,但是我不明白這個區別。你能否請我解釋一下,或者向我指出任何優質資源的方向?再次感謝! – JonaGik 2012-02-02 23:35:17

+1

@JonaGik:請參閱http://stackoverflow.com/q/79923/10077 – 2012-02-02 23:41:31

+1

將系統中的每個變量都視爲板塊。當你輸入一個函數時,參數和局部變量被添加到它們變髒並被使用的板塊堆中。當你離開這個功能時,你的盤子需要清理乾淨,所以它們會被扔進水槽。堆更像是一張桌子,有名片(地址)。你可以在桌子上放一個新的盤子,任何人都可以使用它,如果他們知道這個名字(例如地址),但你最終必須在刪除後自行清理。沒有人喜歡一張亂七八糟的表格:-) – Joel 2012-02-02 23:45:00

4

所有自動變量在函數退出後都會被移除,包括數組。這通常是所有非靜態局部變量。

+3

所有*自動*變量不復存在。局部變量可以是「靜態的」,在這種情況下,它們的生命週期超出了單個函數調用的範圍(事實上直到過程結束)。 – 2012-02-02 23:50:15

+0

你是對的。編輯。 – Joel 2012-02-02 23:53:36