首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言動態內存管理:malloc/free 與 new/delete 核心差異

     編輯:關於C語言

malloc/free:C 標準庫函數

  • 功能:申請/釋放原始字節塊,返回 void*,需強制轉型。
  • 頭文件:<stdlib.h>。
  • 特點:僅管理內存,不調用構造/析構函數,不知類型、不關心對象語義。
  • 可覆蓋:是普通函數,可被自定義實現替換(如內存池、檢測工具)。
  • 指針運算:返回的指針可自由移動(p+1 指向下一字節),靈活但危險。

new/delete:C++ 運算符

  • 功能:分配內存 並調用構造函數;釋放前 調用析構函數。
  • 類型安全:返回具體類型指針,無需轉型。
  • 可重載:可全局或類級重載 operator new/delete,實現自定義分配策略(對齊、內存池、診斷)。
  • 失敗行為:拋出 std::bad_alloc(或返回 nothrow 版本的 nullptr),而 malloc 返回 NULL。

對比表

維度malloc/freenew/delete
性質庫函數運算符(編譯器內建)
構造/析構無自動調用
返回類型void*T*
失敗處理返回 NULL拋出異常
重載/覆蓋可覆蓋函數可重載運算符
數組支持手動計算大小new T[n] / delete[] 自動管理
適用對象POD、C 結構體、原始緩衝區所有 C++ 類類型(含非平凡構造/析構)

靜態 vs 動態內存

// 靜態(編譯期確定大小,棧/數據段)
char a[10];          // 10 字節
int arr[100];        // 400 字節

// 動態(運行期確定,堆)
char* p = (char*)malloc(10);
int*  q = new int[100];
  • 靜態:生命週期由作用域/程序自動管理,速度快,但大小固定、大對象易棧溢出。
  • 動態:大小靈活、生命週期可控,但需手動管理、有碎片化風險、分配較慢。

最佳實踐

  1. C++ 代碼首選 new/delete(或智能指針 unique_ptr/shared_ptr、容器 vector/string),保證構造/析構正確執行。
  2. 只在以下場景用 malloc/free:
     ① 純 C 代碼
     ② 需要 realloc 擴縮緩衝區
     ③ 分配原始字節緩衝區供 placement new 使用
     ④ 與 C 庫交互(如 strdup 返回的指針需 free)
  3. 嚴禁混用:malloc 分配必須 free,new 必須 delete,new[] 必須 delete[],交叉使用導致未定義行為。
  4. 檢查返回值:malloc 後判 NULL,new 捕獲異常或用 nothrow 版。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved