棧和堆的區別

2021-09-09 08:27:37 字數 912 閱讀 9382

說起會了解這個東西,還是比較尷尬的,在學校裡面老師一般不會講解c++的堆和棧,大多數人了解的堆和棧是資料結構裡面的概念,而這裡一般面試官想問的是c++的記憶體分割槽管理方式。

首先說明,在c++中,記憶體分為5個區:堆、佔、自由儲存區、全域性/靜態儲存區、常量儲存區

棧:是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數、函式引數等。堆:是由new分配的記憶體塊,由程式設計師釋放(編譯器不管),一般乙個new與乙個delete對應,乙個new與乙個delete對應。如果程式設計師沒有釋放掉,        資源將由作業系統在程式結束後自動**。自由儲存區:是由malloc等分配的記憶體塊,和堆十分相似,用free來釋放。全域性/靜態儲存區:全域性變數和靜態變數被分配到同一塊記憶體中(在c語言中,全域性變數又分為初始化的和未初始化的,c++中沒有這一區分)。常量儲存區:這是一塊特殊儲存區,裡邊存放常量,不允許修改。(注意:堆和自由儲存區其實不過是同一塊區域(這句話是有問題的,下文解釋),new底層實現**中呼叫了malloc,new可以看成是malloc智慧型化的高階版本,詳情參見new和malloc的區別及實現方法,  以及 這一篇)

自由儲存區是c++基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,c語言使用malloc從堆上分配記憶體,使用free釋放已分配的對應記憶體。自由儲存區不等於堆,如上所述,布局new就可以不位於堆中

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...