首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ new char(n) vs new char[n]:釋放內存報錯的經典陷阱與正確姿勢

     編輯:程式設計綜合問答

錯誤代碼

char* p = new char(strlen(m) + 1);  // ❌ 括號 () 分配單個 char 並初始化為該值
strcpy(p, m);                        // 越界寫入,破壞堆元數據
delete[] p;                          // 報錯:heap corruption / invalid pointer

根本原因:`new char(N)` 與 `new char[N]` 完全不同

語法含義返回類型適用場景
`new char(n)`分配**單個** `char`,用 `n` **初始化**其值`char*`極少用,如 `new char('A')`
`new char[n]`分配**連續 n 個** `char` 數組(未初始化)`char*`字符串緩衝區、動態數組

正確代碼

char* p = new char[strlen(m) + 1];  // ✅ 中括號 [] 分配數組
strcpy(p, m);                        // 安全拷貝
// ... 使用 p ...
delete[] p;                          // ✅ 匹配 new[] 必須用 delete[]

為什麼釋放時會報錯?

  1. `new char(n)` 只分配 1 字節,`strcpy` 寫入 `strlen(m)+1` 字節 → **堆緩衝區溢出**
  2. 2. 溢出破壞了堆管理元數據(塊頭/塊尾) 3. `delete[] p` 讀取元數據時發現不一致 → 拋出 heap corruption 錯誤

現代 C++ 最佳實踐:拒絕裸指針,用 RAII 容器

// ✅ 推薦:std::string 自動管理內存
std::string p = m;  

// ✅ 或 std::vector 需要字節緩衝區時
std::vector buf(m, m + strlen(m) + 1);

// ✅ 或 std::unique_ptr 必須用裸數組時
auto p = std::make_unique(strlen(m) + 1);
strcpy(p.get(), m);

記憶口訣

中括號配中括號,new[] 必配 delete[];
圓括號只初始化,別當數組用。

總結

`new char(n)` 分配**單字節**並初始化,`new char[n]` 才分配**字節數組**。字符串緩衝區必須用**中括號 `[]`**,釋放用 `delete[]`。現代 C++ 應優先用 `std::string`/`std::vector`/`unique_ptr[]` 避免手動內存管理錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved