new和malloc的區(qū)別

new和malloc都用于動態(tài)申請內(nèi)存

  1. 從本質(zhì)上來說,malloc是C中的函數(shù),需要聲明特定的頭文件。而new是C++中的關(guān)鍵字(操作符),它本身不是函數(shù),所以不依賴于頭文件,C++譯器就可以把new編譯成目標代碼(還會根據(jù)參數(shù)的類型插入相應(yīng)的構(gòu)造函數(shù))。
  2. 從使用上來說,如下幾點不同:
    • 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也一樣。

參考文章:

https://zhidao.baidu.com/question/1370118115766445699.html?fr=iks&word=new%BA%CDmalloc%B6%BC%C4%DC%B4%B4%BD%A8%D0%C2%B5%C4%B6%D4%CF%F3%2C%C7%F8%B1%F0%D4%DA%C4%C4%2C%C4%C4%B8%F6%D0%A7%C2%CA%B8%FC%B8%DF&ie=gbk

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:http://www.cnblogs.com/fly1988happy/archive/2012/04/26...
    冰吉凌閱讀 542評論 0 4
  • 閱讀目錄前言new與malloc的10點區(qū)別1. 申請的內(nèi)存所在位置2.返回類型安全性3.內(nèi)存分配失敗時的返回值4...
    yangqi916閱讀 2,078評論 0 4
  • 1 malloc函數(shù) malloc的全稱是memory allocation,中文叫做:動態(tài)內(nèi)存分配。 原型:ex...
    冰吉凌閱讀 3,009評論 0 3
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒有Protection行為...
    阿面a閱讀 7,885評論 0 10
  • C語言中內(nèi)存分配 在任何程序設(shè)計環(huán)境及語言中,內(nèi)存管理都十分重要。在目前的計算機系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,300評論 0 2

友情鏈接更多精彩內(nèi)容