new與malloc的區別

 

1.malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存

2.對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。

3.因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。 
4.C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。 
5.new可以認爲是malloc加構造函數的執行。new出來的指針是直接帶類型信息的。而malloc返回的都是void*指針。

new/delete在實現上其實調用了malloc,free函數

6.new建立的對象你可以把它當成一個普通的對象,用成員函數訪問,不要直接訪問它的地址空間;malloc分配的是一塊內存區域,就用指針訪問好了,而且還可以在裏面移動指針.

7.new 建立的是一個對象;malloc分配的是一塊內存.

*******************************************************************************************************************

相同點:都可用於申請動態內存和釋放內存

不同點: 
(1)操作對象有所不同。 
malloc與free是C++/C 語言的標準庫函數,new/delete 是C++的運算符。對於非內部數據類的對象而言,光用malloc/free 無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數, 對象消亡之前要自動執行析構函數。由於malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加malloc/free。

(2)在用法上也有所不同。 
函數malloc 的原型如下: 
void * malloc(size_t size); 
用malloc 申請一塊長度爲length 的整數類型的內存,程序如下: 
int *p = (int *) malloc(sizeof(int) * length); 
我們應當把注意力集中在兩個要素上:“類型轉換”和“sizeof”。 
malloc 返回值的類型是void *,所以在調用malloc 時要顯式地進行類型轉換,將void * 轉換成所需要的指針類型。 
malloc 函數本身並不識別要申請的內存是什麼類型,它只關心內存的總字節數。

函數free 的原型如下: 
void free( void * memblock ); 
爲什麼free 函數不象malloc 函數那樣複雜呢?這是因爲指針p 的類型以及它所指的內存的容量事先都是知道的,語句free(p)能正確地釋放內存。如果p 是NULL 指針,那麼free

對p 無論操作多少次都不會出問題。如果p 不是NULL 指針,那麼free 對p連續操作兩次就會導致程序運行錯誤。

new/delete 的使用要點 
運算符new 使用起來要比函數malloc 簡單得多,例如: 
int *p1 = (int *)malloc(sizeof(int) * length); 
int *p2 = new int[length]; 
這是因爲new 內置了sizeof、類型轉換和類型安全檢查功能。對於非內部數據類型的對象而言,new 在創建動態對象的同時完成了初始化工作。如果對象有多個構造函數,那麼new 的語句也可以有多種形式。

如果用new 創建對象數組,那麼只能使用對象的無參數構造函數。例如 
Obj *objects = new Obj[100]; // 創建100 個動態對象 
不能寫成 
Obj *objects = new Obj[100](1);// 創建100 個動態對象的同時賦初值1 
在用delete 釋放對象數組時,留意不要丟了符號‘[]’。例如 
delete []objects; // 正確的用法 
delete objects; // 錯誤的用法 
後者相當於delete objects[0],漏掉了另外99 個對象。

*****************************************************************************************************************

1  new自動計算需要分配的空間,而malloc需要手工計算字節數 
2  new是類型安全的,而malloc不是,比如: 
int* p = new float[2]; // 編譯時指出錯誤 
int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤 
new operator 由兩步構成,分別是 operator new 和 construct 
3  operator new對應於malloc,但operator new可以重載,可以自定義內存分配策略,甚至不做內存分配,甚至分配到非內存設備上。而malloc無能爲力 
4  new將調用constructor,而malloc不能;delete將調用destructor,而free不能。 
5  malloc/free要庫文件支持,new/delete則不要

/ / 來源於網絡
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章