new和malloc都用于動態申請內存
- 從本質上來說,malloc是C中的函數,需要聲明特定的頭文件。而new是C++中的關鍵字(操作符),它本身不是函數,所以不依賴于頭文件,C++譯器就可以把new編譯成目標代碼(還會根據參數的類型插入相應的構造函數)。
-
從使用上來說,如下幾點不同:
new和delete是操作符,可以重載,只能在C++中使用。而malloc,free是函數,可以覆蓋,C、C++中都可以使用。
new可以自動計算所需要的字節大小。而malloc必須人為的計算出所需要的字節數。在Linux中可以有這樣:malloc(0),這是因為Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的,但是在某些系統中是不允許malloc(0)的。
分配內存成功的話,new返回指定類型的指針。而malloc返回void指針,可以在返回后強行轉換為實際類型的指針。對于C++,如果寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉換。而對于C,沒有這個要求,但為了使C程序更方便的移植到C++中來,建議養成強制轉換的習慣。
分配內存失敗時,new會throw一個異常std::bad_alloc。而malloc會返回空指針。
new可以調用對象的構造函數,對應的delete調用相應的析構函數。而malloc僅僅分配內存,free僅僅回收內存,并不執行構造函數和析構函數。
在規范的程序中我們有必要按照這樣的格式去使用malloc及free:
type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))/*請使用if來判斷,這是有必要的*/
{
perror(error...);
exit(1);
}
/*其它代碼*/
free(p);
p = NULL;/*請加上這句*/
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。比如想分配100個int類型的空間:
int *p = (int*)malloc(sizeof(int) * 100);//分配可以放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,并不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最后釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
對其做一個特例補充
char *ptr;
if((ptr = (char*)malloc(0)) == NULL) puts(Got an null pointer);
else puts(Got a valid pointer);
此時得到的是Got a valid pointer。把0賦給malloc能得到一個合法的指針。
new/delete和malloc/free的效率比較:
1.new/delete的實現其實是調用了malloc/free的。
2.不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete,因為new/delete會自動調用構造析構函數。由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
3.既然new/delete的功能完全覆蓋了malloc/free,為什么C++不malloc/free淘汰出局呢?這是因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。如果用free釋放“new創建的動態對象”,那么該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。