malloc和new的十一個區別

一 屬性
1 new/delete是c++操作符
2 malloc/free是c/c++標準的庫函數

二 申請內存所在位置
1 new:自由存儲區:自由存儲區是c++基於new操作符的一個抽象概念。通過new申請的內存都稱爲自由存儲區,自由存儲區可以爲堆,也可以爲靜態存儲區(取決於operator new()在哪裏爲對象分配內存)。
2 malloc:堆:堆是操作系統的術語,是系統維護的一塊特殊的區域,用於動態內存分配。

三 返回值類型安全性
1 new:返回一個指定數據類型的指針,無需進行轉換。安全
2 malloc:malloc返回一個void*的指針,需要強制轉換爲我們需要的類型。不安全

四 是否調用構造析構函數
1 new:new開闢空間的時候會調用構造函數,delete釋放空間的時候調用析構函數
2 malloc:malloc開闢空間的時候不調用構造函數,free釋放空間的時候不調用析構函數

五 是否存在相互調用情況
1 new:當new用於開闢類空間的時候,new先調用operator new()函數(該函數並不是new的重載),而該函數就是malloc的一層封裝。然後調用構造函數對對象進行初始化。
delete釋放空間的時候先調用析構函數對成員進行清理,然後調用operator delete()進行釋放空間,而該函數是free的一層封裝。
2 malloc:malloc不能調用new

六 是否有對於數組類型的特別的處理
1 new:我們知道new[]/delete[]就是用於開闢一段連續的空間和釋放一段連續的空間的。
new[]和new的操作不同,它先會調用operator new[]()函數,然後調用operator new()開闢出一塊給定大小加4個字節的空間(多出來的四個字節在開頭,用於記錄調用析構函數的次數),最後調用N次構造函數,對其進行初始化(如果開闢的是類空間的話)。
delete[]和delete的操作也不同,它先會調用N次析構函數對成員進行清理,然後調用operator delete[](),調用operator delete()。
2 malloc:並沒有針對數組的特別操作

七 內存分配失敗敗時的返回值
1 new:new失敗時是拋出bac_alloc異常,而不是返回一個NULL。所以對其返回值作if(NULL==pointer)的判斷是沒有用的。如果new開闢失敗,拋出異常,然後直接跳過new後面的代碼。正確的做法是捕捉異常:

try {
      int* p = new int[SIZE];
            // 其它代碼
    } 
    catch ( const bad_alloc& e )
     {
            return -1;
     }

2 malloc:內存分配失敗時返回一個NULL指針

八 是否需要指定開闢內存大小
1 new:編譯器會根據類型信息自行計算
2 malloc:需要認爲指定開闢空間的大小

九 是否可以被重載
1 new:new允許被重載,標準庫定義了new的八個重載版本
2 malloc:不允許

十 是否能夠直觀地分配內存
1 new:不能
2 malloc:在分配的內存空間不足時,可以調用realloc函數進行擴充。

十一 客戶處理內存分配不足
1 new :客戶可以通過制定處理函數和重新制定分配器的方式來處理內存分配不足的情況
2 malloc:malloc無法處理

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