| 特性 | C 風格 | C++ 風格 |
| 配置單一物件 | malloc(sizeof(Type)) | new Type |
| 配置陣列 | malloc(n * sizeof(Type)) | new Type[n] |
| 釋放單一 | free(ptr) | delete ptr |
| 釋放陣列 | free(ptr) | delete[] ptr |
| 型別安全 | 需強制轉型 (Type*) | 自動推導型別,回傳 Type* |
| 建構/析構 | 不呼叫 | **自動呼叫建構函數/析構函數** |
基本語法
// 單一物件
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 做不到。
配對鐵律與常見錯誤
| 錯誤 | 後果 | 正確 |
new Type[n] 配對 delete p | 未定義行為(通常僅析構第一個元素,記憶體洩漏) | delete[] p |
new Type 配對 delete[] p | 未定義行為 | delete p |
malloc 配對 delete | 未定義行為 | 同一家族配對 |
未檢查 new 失敗 | 舊標準拋出 bad_alloc,新標準 new (nothrow) 回傳 nullptr | 使用 try-catch 或 nothrow 版本 |
進階: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 多見於底層庫實作。
- 上一篇文章: C++ inline 內聯函數深度解析
- 下一篇文章: C++ 在 C 基礎上的關鍵改進細節
Copyright ©
程式碼之家 All Rights Reserved