C++中new和malloc有什么區別 構造與析構函數的影響

new會調用構造函數而malloc不會,1. new是操作符專為對象設計,自動調用構造函數,malloc僅分配原始內存;2. new/delete自動調用析構函數,malloc/free需手動調用;3. new返回具體類型指針無需轉換,malloc返回void*需強轉;4. new在內存不足時拋出異常,malloc返回NULL需手動檢查。

C++中new和malloc有什么區別 構造與析構函數的影響

c++中,new和malloc都能用來動態分配內存,但它們之間存在本質區別,尤其是在涉及對象構造與析構時。簡單來說:new會調用構造函數,而malloc不會

C++中new和malloc有什么區別 構造與析構函數的影響


1. 內存分配機制不同

new是C++的操作符,專為對象設計;它不僅分配內存,還會自動調用對象的構造函數。
malloc則是c語言標準庫函數,只負責分配原始內存,不會執行任何構造邏輯。

C++中new和malloc有什么區別 構造與析構函數的影響

比如:

立即學習C++免費學習筆記(深入)”;

MyClass* obj1 = new MyClass();   // 分配內存 + 構造函數調用 MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));  // 僅分配內存,無構造函數調用

如果你用malloc來創建對象,后續要手動調用構造函數(可以通過定位new),否則對象狀態不完整。

C++中new和malloc有什么區別 構造與析構函數的影響


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。

基本上就這些。

以上就是C++中new和malloc有什么

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享