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