C C 記憶體管理

2021-08-30 21:50:54 字數 2517 閱讀 1445

首先來看一下c/c++中記憶體的分布

棧區:又稱作堆疊,非靜態區域性變數,函式引數,返回值都是儲存在棧區的,函式棧幀的建立也是在棧區的

一般棧區的大小只有十幾m

資料段:存放靜態資料和全域性資料的。

**段:存放可執行的**和唯讀常量。

了解完記憶體的分布接下來我們來了解記憶體的管理方式

在c語言中記憶體的管理方式是通過兩個函式  malloc 和 free搭配使用

而c++中則是兩個操作符 new 和 delete 搭配使用

我們看看new 和 delete的使用方法

int *ptr = new int;

int *ptr2 = (int *)malloc(sizeof(int));

delete ptr;

free(ptr2);

可以看出new比malloc更簡潔因為我們不用自己去計算型別大小,編譯器會幫我們完成。

而malloc相比就比較麻煩一點。

new的優勢不僅僅如何。new還可以申請空間並進行初始化

內建型別:

int *ptr1 = new int; //申請乙個大小為int的空間

int *ptr2 = new int(10);//申請乙個大小為int的空間並初始化為10

int *ptr3 = new int[10];//申請十個大小為int的空間

delete ptr1;

delete ptr2;

delete ptr3;

我們可以看到new不僅可以為我們申請空間還能對我們的空間進行初始化,這一點是malloc做不到的。

自定義型別:

通過程式的結果我們發現了new和delete分別呼叫了我們的建構函式和析構函式。而malloc和free卻沒有

這就是自定義型別的差別,我們可以通過new呼叫建構函式來對我們的空間進行初始化,而malloc卻做不到。

接下來我們說一下new和delete的過程。

new和delete雖然是兩個操作符但底層確實他們通過呼叫operator new和operator delete這兩個系統定義的全域性函式。

這裡的operator並不是運算的過載,希望大家不要混淆

而operator new 和 operator delete又是通過呼叫malloc和free來實現空間的申請,但不同的是malloc申請失敗會返回0

而operator new失敗則會丟擲異常,但我們一般是看不到的需要我們通過捕獲得到異常資訊,這裡就不一 一 贅述

假如申請和成功然後new還會呼叫建構函式,釋放空間前delete還會呼叫析構函式對空間進行打掃

我們可以理解成下面這樣的關係:

new test=>operator new 開空間 => malloc => 構造

malloc test =>malloc

內建型別的話new和malloc效果一樣,但是對於自定義型別,new開空間時會自動呼叫建構函式(完成初始化)

delete還會呼叫析構函式完成清理。

operator new = (malloc+失敗拋異常)

operator delete = free

最後我們將new delete和 malloc free的區別進行總結  

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可以,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...