首先來看一下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...