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

C++ new 與 delete 運算子完整指南

     編輯:C++ 基礎

從 malloc/free 到 new/delete

基本語法

// 單一物件
int* p1 = new int;        // 未初始化
int* p2 = new int(42);    // 初始化為 42
int* p3 = new int();      // 值初始化為 0 (C++98 起)
delete p1; delete p2; delete p3;

// 陣列
int* arr1 = new int[10];       // 10 個未初始化 int
int* arr2 = new int[10]();     // 10 個 0
int* arr3 = new int[3]{1,2,3}; // C++11 列表初始化
delete[] arr1; delete[] arr2; delete[] arr3;

核心優勢:建構/析構自動綁定

class Widget {
public:
    Widget() { cout << "建構\n"; }
    ~Widget() { cout << "析構\n"; }
};

int main() {
    Widget* p = new Widget; // 輸出: 建構
    delete p;               // 輸出: 析構
    return 0;
}

這是 C++ **RAII 基石**:物件生命週期與資源管理綁定,malloc/free 做不到。

配對鐵律與常見錯誤

特性C 風格C++ 風格
配置單一物件malloc(sizeof(Type))new Type
配置陣列malloc(n * sizeof(Type))new Type[n]
釋放單一free(ptr)delete ptr
釋放陣列free(ptr)delete[] ptr
型別安全需強制轉型 (Type*)自動推導型別,回傳 Type*
建構/析構不呼叫**自動呼叫建構函數/析構函數**

進階:placement new(定位配置)

char buffer[sizeof(Widget)];
Widget* p = new (buffer) Widget(); // 在預備緩衝區建構物件
p->~Widget(); // 手動呼叫析構,不釋放記憶體(buffer 由外部管理)

用於記憶體池、共享記憶體、嵌入式系統等精確控制記憶體佈局場景。

總結

  • new/delete:單一物件,自動建構/析構,型別安全。
  • new[]/delete[]:陣列,**嚴禁混用**單一版本。
  • 核心價值:**建構函數與記憶體配置綁定**,構建 RAII、智慧指標、標準庫容器的基石。
  • 現代 C++ 偏好 std::make_unique、std::make_shared、std::vector 等高階抽象,手動 new/delete 多見於底層庫實作。
  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved
    錯誤後果正確
    new Type[n] 配對 delete p未定義行為(通常僅析構第一個元素,記憶體洩漏)delete[] p
    new Type 配對 delete[] p未定義行為delete p
    malloc 配對 delete未定義行為同一家族配對
    未檢查 new 失敗舊標準拋出 bad_alloc,新標準 new (nothrow) 回傳 nullptr使用 try-catch 或 nothrow 版本