c 記憶體管理

2021-07-25 11:32:57 字數 1655 閱讀 4578

在c/c++中記憶體分為5個區,分別為棧區、堆區、全域性/靜態儲存區、常量儲存區、**區。

棧區:

指那些由編譯器在需要的時候分配,不需要時自動清除的變數所在的儲存區。如函式執行時,函式的形參以及函式內的區域性變數分配在棧區,函式執行結束後,形參和區域性變數出棧(自動釋放)。棧記憶體分配運算內建與處理器的指令集中,效率高但是分配的記憶體空間有限。

堆區:

指那些由程式猿手動分配釋放的儲存區,如果程式猿不釋放這塊記憶體,記憶體將一直被占用,直到程式執行結束由作業系統進行**。c語言中使用malloc,free申請和釋放空間,c++中使用new、delete分配和釋放空間。

全域性區(靜態區):

全域性變數和靜態變數的儲存是放在一起的,其中初始化的全域性變數和靜態變數在乙個區域(初始化區),未初始化的全域性變數和靜態變數在相鄰的另乙個區域(未初始化區)。這塊空間當程式執行結束後由系統釋放。

常量區:

常量字串就是儲存在這裡的,如形如」abc」的字串就儲存在常量區,儲存在常量區的唯讀不可寫。const 修飾的全域性變數也儲存在常量區(取決於編譯器),而const修飾的區域性變數依然儲存在棧上。

**區:

存放函式體的二進位制**。

堆區棧區對比:

1、申請方式:

棧由編譯器管理;

堆的分配和釋放由程式猿管理(malloc、free),容易造成記憶體洩漏和二次刪除;

2、申請大小:

棧是向低位址生長的資料結構,是一塊連續的記憶體,能從棧獲得的空間較小,編譯期確定大小;我們可以在終端中使用ulimit -a 命令檢視棧空間上限;

堆是向高位址生長的資料結構,是乙個不連續的儲存空間,記憶體獲取比較靈活,也比較大

3、 申請後系統的響應

棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣,**中的delete語句才能正確的釋放本記憶體空間。 另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。

4、堆和棧中的儲存內容

棧: 在函式呼叫時,第乙個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的(注意有的從左往右),然後是函式中的區域性變數。注意靜態變數是不入棧的。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容由程式設計師安排。

小結:

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

int a = 0; 函式體外定義為全域性變數 全域性初始化區

in t b; 函式體外定義為全域性變數 全域性未初始化區

main()

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...