new會調用構造函數而malloc不會,1. new是操作符專為對象設計,自動調用構造函數,malloc僅分配原始內存;2. new/delete自動調用析構函數,malloc/free需手動調用;3. new返回具體類型指針無需轉換,malloc返回void*需強轉;4. new在內存不足時拋出異常,malloc返回NULL需手動檢查。
在c++中,new和malloc都能用來動態分配內存,但它們之間存在本質區別,尤其是在涉及對象構造與析構時。簡單來說:new會調用構造函數,而malloc不會。
1. 內存分配機制不同
new是C++的操作符,專為對象設計;它不僅分配內存,還會自動調用對象的構造函數。
malloc則是c語言的標準庫函數,只負責分配原始內存,不會執行任何構造邏輯。
比如:
立即學習“C++免費學習筆記(深入)”;
MyClass* obj1 = new MyClass(); // 分配內存 + 構造函數調用 MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass)); // 僅分配內存,無構造函數調用
如果你用malloc來創建對象,后續要手動調用構造函數(可以通過定位new),否則對象狀態不完整。
2. 構造與析構函數的調用差異
使用new創建的對象,在生命周期結束時,通過delete釋放內存時會自動調用析構函數。
而malloc分配的內存即使通過free釋放,也不會調用析構函數。
這意味著:
- 如果你管理的是類對象,忘記手動調用析構函數可能導致資源泄漏。
- 使用new/delete能更安全地管理對象生命周期。
舉個例子:
MyClass* obj = new MyClass(); delete obj; // 正確調用析構函數 MyClass* raw = (MyClass*)malloc(sizeof(MyClass)); new(raw) MyClass(); // 手動調用構造函數 raw->~MyClass(); // 手動調用析構函數 free(raw);
3. 類型安全與返回值類型
- new返回的是具體的類型指針,不需要強制轉換。
- malloc返回的是void*,必須手動強轉為目標類型。
這點雖然看起來小,但在實際開發中會影響代碼可讀性和安全性。例如:
int* p1 = new int; // 正確且無需轉換 int* p2 = malloc(sizeof(int)); // 需要強轉:int* p2 = (int*)malloc(sizeof(int));
4. 異常處理機制不同
- new在內存不足時默認會拋出std::bad_alloc異常(除非使用nothrow版本)。
- malloc則返回NULL,需要手動檢查是否分配成功。
所以如果你希望程序在內存不足時有更靈活的處理方式,使用new(nothrow)或者檢查malloc結果都是常見做法。
總的來說,如果你在C++中操作的是類對象,尤其是帶有構造/析構邏輯的對象,應該優先使用new和delete。
只有在極少數情況下,比如需要直接操作內存塊、或兼容C接口時,才考慮用malloc。
基本上就這些。