new和malloc的區別

new和malloc都用于動態申請內存

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

參考文章:

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容