天天看點

C++中malloc和new的差別

malloc與new的9點差別:

1.申請的記憶體所在位置

        new操作符從自由存儲區上為對象動态配置設定記憶體空間,而malloc函數從堆上動态配置設定記憶體。

        自由存儲區不僅可以是堆,還可以是靜态存儲區,這都要看operator new在哪裡為對象配置設定記憶體。

2.傳回類型安全性

        new操作符記憶體配置設定成功時,傳回的是對象類型的指針,類型嚴格與對象比對,無須進行類型轉換,故new是符合類型安全性的操作符。

        malloc記憶體配置設定成功則是傳回void * ,需要通過強制類型轉換将void *指針轉換成我們需要的類型。

3.記憶體配置設定失敗時的傳回值

        new記憶體配置設定失敗時,會抛出bac_alloc異常,它不會傳回NULL;

        malloc配置設定記憶體失敗時傳回NULL。

4.是否需要指定記憶體塊的大小

        使用new操作符申請記憶體配置設定時無須指定記憶體塊的大小,編譯器會根據類型資訊自行計算

        而malloc則需要顯式地指出所需記憶體的尺寸。

5,是否調用構造函數/析構函數

       使用new操作符來配置設定對象記憶體時會經曆三個步驟:

       step1:調用operator new函數(對于數組是operator new[])配置設定一塊足夠大的,原始的,未命名的記憶體空間以便存儲特定類型的對象。

       step2:編譯器運作相應的構造函數以構造對象,并為其傳入初值。

       step3:對象構造完成後,傳回一個指向該對象的指針。

       使用delete操作符來釋放對象記憶體時會經曆兩個步驟:

       step1:調用對象的析構函數

       step2:編譯器調用operator delete(或operator delete[])函數釋放記憶體空間。

        是以,new/delete會調用對象的構造函數/析構函數以完成對象的構造和析構。而malloc不會調用。

6.對數組的處理

        new[],delete[]專門處理數組類型,malloc隻需用手動自定數組的大小。

7.new與malloc是否可以互相調用

        operator new / operator delete 的實作可以基于malloc。 而malloc的實作不可以調用new。

8.是否可以被重載

        operator new / operator delete可以被重載。

        malloc和free不允許重載。

9.能夠直覺地重新配置設定記憶體

        使用malloc配置設定的記憶體後,如果在使用過程中發現記憶體不足,可以使用realloc函數進行記憶體重新配置設定實作記憶體的擴充。

        realloc先判斷目前的指針所指記憶體是否有足夠的連續空間,如果有,原地擴大可配置設定的記憶體位址,并傳回原來的位址指針;

        如果空間不夠,先按照新指定的大小配置設定空間,将原有資料從頭到尾拷貝到新配置設定的記憶體區域,而後釋放原來的記憶體區域。

        new沒有這樣隻管的配套設施來擴充記憶體。

總結:

C++中malloc和new的差別

繼續閱讀