C C 記憶體管理

2021-09-26 23:34:42 字數 2651 閱讀 9223

(1)c/c++記憶體分布

棧:存放非靜態區域性變數/函式引數/返回值等等,棧是自上向下增長的

堆:用於動態記憶體分配,堆是自下向上增長的

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

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

(2)new的使用

// 動態申請乙個int型別的空間     

int* ptr1 = new int;

// 動態申請乙個int型別的空間並初始化為10     

int* ptr2= new int(10); 

// 動態申請10個int型別的空間     

int* ptr3 = new int[3];

delete ptr1;     

delete ptr2;     

delete ptr3; 

(3)malloc/calloc/realloc/free比較

malloc:   void* malloc (size_t size)

這個函式向記憶體申請一塊連續可用的空間,

並在申請成功後返回指向這塊空間的指標。

注意:如果開闢失敗就會返回null指標,

所以malloc返回值一定要做檢查

calloc:   void* calloc (size_t num, size_t size);

函式的功能是為 num 個大小為 size 的元素開闢

一塊空間,並且把空間的每個位元組初始化為0

realloc:  void* realloc (void* ptr, size_t size); 

該函式就是調整原位址空間大小

ptr 是要調整的記憶體位址

size 就是調整之後的記憶體大小

返回值:就是調整之後的記憶體的起始位置

(原因:因為調整大小如果原來記憶體空間後面有足夠

的空間進行擴充就在原有記憶體之後追加空間,原來

空間資料不發生變化;如果原有空間後面沒有足夠的

空間進行擴充,那麼就會在堆上另找乙個合適大小

的連續空間來使用,並且返回乙個新的記憶體位址,拷

貝原有空間資料到新的記憶體,最後釋放原有空間)

free: 釋放動態記憶體

(4)new和delete的實現原理

4.1 內建型別 

如果申請的是內建型別的空間,new和malloc,delete和free基本類

似,不同的地方是:new/delete申請和 釋放的是單個元素的空間,

new和delete申請的是連續空間,而且new在申請空間失敗時會拋

異常, malloc會返回null。

4.2 自定義型別 

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

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

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

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

new t[n]的原理 

1. 呼叫operator new函式,在operator new中實際調

用operator new函式完成n個物件空間的申請

2. 在申請的空間上執行n次建構函式

delete的原理

1. 在釋放的物件空間上執行n次析構函式,完成n個物件

資源的清理

2. 呼叫operator delete釋放空間,實際在operator delete

中呼叫operator delete來釋放空間                        

(5)malloc/free和new/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

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...