malloc/free 和 new/delete的联系和区别
一、malloc/free
?
1、? 函數原型:void* malloc(longNumBytes)?
該函數分配了NumBytes個字節,并返回了只想這塊空間的的指針。如果分配失敗則返回空。
函數原型:Void free(void *firstBytes)
該函數是將之前用malloc分配的內存空間釋放,還給操作系統。參數為只想那塊空間的首地址。
2、? 內存操作:
Malloc函數的參數是接受需要分配的內存字節,如果內存滿足請求量則返回:指向被分配內存起始位置地址的指針。
Free函數是釋放的是指針指向的內存空間,不是刪除指針本身(其中指針指向所釋放內存空間的首地址)。
3、? malloc如何申請內存空間?
malloc從堆中獲取空間,即函數返回的指針是指向堆中的一塊內存。操作系統中有一個記錄空閑內存地址的鏈表,當向操作系統申請時,就會遍歷鏈表,尋找一個空間大于所申請空間的堆節點,然后將該節點從鏈表中刪除,并分配給程序。
調用free函數時,他將用戶釋放的內存連接到空閑鏈表上,這是空閑手鏈表會被切成一塊塊片段,如過找不到適合的內存,,于是malloc請求延時,對片段進行整理,因此malloc函數在申請空間時一定要進行判斷
?
二、new/delete
?
new的時候發生兩件事情:
1)? 內存被分配(通過operatornew函數)
2)? 為被分配的內存調用一個或多個構造函數構建對象
Delete時:
1)? 為將要被釋放的內存調用一個或者多個析構函數
2)? 釋放內存(通過operatordelete函數)
注:調用new []開辟空間,必須調用delete[]釋放,反之new必須調用delete釋放。
?
三、malloc/free和new/delete的本質區別
?
1、? malloc返回值是void *,使用時要進行相對應的顯示轉換。New不用。
2、? malloc函數只關心內存的總字節數。New自動計算需要分配的內存(創建對象)。
3、? malloc/free 是庫函數,new delete是C++運算符。
1)? 運算符只能重載不能自定義。
2)? 任何函數都可以重載或者覆蓋,但通常不能改變運算符內部作用于內置類型的行為,比如不能operator + 讓2+3 產生6 的結果。
3)? New/delete能對對象進行構造和析構的調用進而對內存進行詳細工作。malloc/free不可以
4)? Malloc分配內存失敗返回NULL。new操作符分配內存失敗時默認的操作是拋出一個內部的異常,拋出之后,程序跳出new那一行代碼不再執行。
5)? Malloc分配的內存永遠都是進程的虛擬內存,malloc 是調用VirtualAlloc的。free也只是釋放虛擬內存。
6)? 因為C++經常調用c函數,而c程序只能調用malloc/free管理動態內存。
?
四、釋放的內存會被系統馬上回收嗎?
?
Free釋放內存會調用free函數時,他將用戶釋放的內存連接到空閑鏈表上,這是空閑手鏈表會被切成一塊塊片段,如過找不到適合的內存,,于是malloc請求延時,對片段進行整理,因此malloc函數在申請空間時一定要進行判斷。
?
?
五、使用范例
?
void *malloc(size_t size);
用malloc 申請一塊長度為length的整數類型的內存,程序如下:
int *p = (int *)malloc(sizeof(int) * length);
我們應當把注意力集中在兩個要素上:“類型轉換”和“sizeof”。
1. malloc 返回值的類型是void *,所以在調用malloc 時要顯式地進行類型轉換,將void* 轉換成所需要的指針類型。
總結
以上是生活随笔為你收集整理的malloc/free 和 new/delete的联系和区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一季8:mpp的部署、sample的编
- 下一篇: 共轭梯度法(Conjugate Grad