作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
前幾天一個朋友去面試百度空間的一個職位,被問及這個問題,我聽後說了幾點,不過感覺還是不透徹,所以上網查閱了一些資料,自己又想了想,總結一下。
- 動作不同:
- 在C++中,new一個對象時,程式完成對象的空間的分配的同時,建構函式也被調用,類似,delete一個對象時,對象的空間被釋放的同時解構函式也被調用。
- 在C中,malloc和free 則沒有建構函式和解構函式被調用這個動作。當然,在沒有特定的建構函式或解構函式時,C++也沒有這個動作。
- 關於重載:
- 在C++中,對於任何非數組的空間分配,我們可以通過定義函數名相同但參數不同的建構函式完成對建構函式的重載,而對於數組的空間分配,就只能使用預設建構函式了,若你試圖去開闢一個沒有預設建構函式的數組,Compiler會出錯。
- 在C中,自然是沒有重載這個事情了。
- 傳回值不同:
- 在C中,malloc返回一個void *指標,需要你強制指標類型轉換
- 在C++中,你直接new一個就好。
- 注意,對於基本類型,這個差別是二者唯一的差別,當然不建議在C++中使用malloc+強制類型轉換建立基礎資料型別 (Elementary Data Type)或者對象。
- 定義不同:
- 異常處理方式不同:
- 分配空間單位不同:
- new分配單位為對象所佔用空間的倍數。
- malloc為位元組
-
使用提示:
1.delete使用不當會造成記憶體泄露,下邊的這個例子就是只有第一個t被釋放掉:
Test* t = new Test[3];
delete t;
而下列代碼會導致堆崩潰或資料丟失。
Test* t = new Test; delete[] t; // <-- This is even worse
2.realloc只能用於malloc。C++中你只能重新開闢空間、複製、釋放原來空間來完成相同的操作。
3.效能區別,根據http://code.dawnofthegeeks.com/2009/05/04/fyi-new-vs-malloc/ 其中提到malloc/free慢於new/delete,但是在後來筆者開發的一個程式中卻出現了不同的情境。
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/