C 記憶體管理

2021-09-23 23:52:08 字數 2625 閱讀 3149

一、記憶體分布

首先我們應該知道各種資料在記憶體中的分布

棧:又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。

記憶體對映段:高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享記憶體,做程序間通訊。

堆:用於程式執行時動態記憶體分配,堆是向上增長的

資料段:儲存全域性資料和靜態資料

**段:可執行**和唯讀常量

二、c語言中的動態記憶體管理方式

malloc:只申請空間

calloc:申請空間,並初始化(按位初始化為0)

relloc:改變空間的大小,可以擴大也可以減小

free:釋放動態申請的空間(堆上的空間)

三、c++記憶體管理方式

c語言中的記憶體管理方式在c++中仍可以使用,但有些地方就無能為力而且用起來比較麻煩,因此c++提出了新的記憶體管理方式:通過new和delete操作符進行動態記憶體管理

void

test()

注:

申請和釋放單個元素的空間,使用new/delete;申請和釋放連續的空間,使用new/delete

在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式;而malloc和free不會呼叫

四、operator new與operator delete函式

new和delete是使用者進行動態記憶體分配的操作符,operator new和operator delete是系統提供的全域性函式,new在底層呼叫operator new來進行記憶體分配,delete在底層通過operator delete進行釋放空間。

operator new函式:該函式通過malloc來申請空間,當malloc申請空間成功後直接返回;申請空間失敗,嘗試執行空間不足應對措施,如果應對措施使用者自定義了,則繼續申請,否則拋異常。

operator delete函式:該函式最終通過free來釋放空間

new的實現:malloc + 異常處理

delete的實現:析構 + free

五、new和delete的實現原理

內建型別:與malloc與free相似;不同:new/delete是申請/釋放單個元素的空間,new和delete申請的是連續空間,而且new在申請失敗後拋異常,malloc申請失敗,返回null。

自定義型別:

new的原理:

呼叫operator new函式申請空間

在申請的空間上執行建構函式,完成物件的構造

delete的原理:

在空間上執行析構函式,完成物件資源的清理工作

呼叫operator delete釋放物件的空間

new t[n]的原理:

呼叫operator new 函式,在operator new中實際呼叫的operator new函式完成n個物件空間的申請

在申請的空間上執行n次構造

delete t[n]的原理

在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理

呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間

六、定位new表示式

使用格式:new(place_address) type 或 new(place_address) type (initializer-list)

使用場景:定位new表示式在實際中一般搭配記憶體池使用,因為記憶體池分配的記憶體沒有初始化

注:不經常使用,對已經分配好的記憶體空間,顯示呼叫建構函式進行初始化

七、常見的面試題

malloc/free和new/delete的區別

malloc和free是函式,new和delete是操作符

malloc申請的空間不會初始化,new申請的空間可以初始化

malloc申請空間時需要手動計算空間大小並傳遞,new只需要在其後跟上空間的型別即可

malloc的返回值為void*,在使用時必須強轉,new不需要,因為new後面跟的是空間型別

malloc申請失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

申請自定義型別物件時,malloc/free只會申請/銷毀空間,不會呼叫構造/析構函式;而new在申請空間時會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

new/delete比malloc/free的效率稍微低一點,因為new/delete在底層封裝了malloc/free

記憶體洩漏

記憶體洩漏指因為疏忽或錯誤造成程式未能及時釋放已經不再使用的記憶體。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤失去了對該段記憶體的控制,因而造成了記憶體的浪費。

常見的記憶體洩漏:

1. 未及時使用delete或free釋放

2. 因為異常導致delete或free沒有執行(非常難發現)

解決方式:

1. 養成良好的**風格

2. 利用raii思想或智慧型指標管理

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

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

C 記憶體管理

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

c 記憶體管理

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