記憶體分布及相關面試題

2021-09-11 08:21:55 字數 1651 閱讀 3471

目錄

在c/c++中記憶體分為5個區,分別為

堆區棧區對比:

記憶體洩漏

malloc與new區別總結

在linux中的記憶體分布

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

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

未初始化全域性變數(bss)區:

未初始化的全域性變數和靜態變數被初始化為 0,載入到記憶體後才分配空間。

初始化全域性變數(資料區):

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

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

**區:

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

1、申請方式:

棧由編譯器管理,自動分配,速度快;

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

2、申請大小:

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

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

3、 申請後系統的響應

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

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

4、堆和棧中的儲存內容

棧:在函式呼叫時,第乙個進棧的是主函式中的下一下可執行語句的位址,然後是函式的各個引數,然後是函式中的區域性變數等。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

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

C 記憶體管理相關面試題

1.malloc free和new delete的區別 malloc free和new delete的共同點是 都是從堆上申請空間,並且需要使用者手動釋放。不同的地方是 1.malloc和free是函式,new和delete是操作符2.malloc申請的空間不能初始化,而new可以初始化 3.mal...

面試題相關

一些位址 osi七層功能及協議 資料鏈路層是如何定址的?傳送方 已知接收方ip arp 接收方mac位址 交換機尋找該mac位址所在埠,把幀往這個埠 mac通過rarp轉為ip位址。可靠通訊是靠哪一層來完成的?網路層 tcp協議 100base t 100mbps,baseband,雙絞線對。簡而言...

js基礎及相關面試題

js基本資料型別 string,object,number,undefined,boolean,function js陣列及其常用的方法 var arr new array arr i 1 新增資料 pop 刪除陣列的方法並返回刪除陣列的值 var arr new array 1,2,3 var d...