C 記憶體管理

2021-09-06 23:26:55 字數 1971 閱讀 6338

我們首先來看一下c++中程式記憶體區域的劃分

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

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

3. 堆用於程式執行時動態記憶體分配,堆是可以上增長的。

4. 資料段--儲存全域性資料和靜態資料。

5. **段--可執行的**/唯讀常量

new和delete操作內建型別:

void test()

new和delete操作自定義型別:

class test

{public:

test()

: _data(0)

{ cout<

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申請和

釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,

malloc會返回null。

自定義型別:

new的原理

1. 呼叫operator new函式申請空間

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

delete的原理

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

2. 呼叫operator delete函式釋放物件的空間

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

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

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

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

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

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

7. new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free。

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

1. 堆記憶體洩漏

堆記憶體指的是程式執行中依據須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊記憶體,用完後必須通過呼叫相應的 free或者delete 刪掉。假設程式的設計錯誤導致這部分記憶體沒有被釋放,那麼以後這部分空間將無法再被使用,就會產生heap leak。

2. 系統記憶體洩漏

指程式使用系統分配的資源,比方套接字、檔案描述符、管道等沒有使用對應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。

要想避免記憶體洩漏,有一種方法是通過智慧型指標避免,這篇部落格是關於智慧型指標的詳細講解:

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

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

C 記憶體管理

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

c 記憶體管理

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