char* p = new char(strlen(m) + 1); // ❌ 括號 () 分配單個 char 並初始化為該值
strcpy(p, m); // 越界寫入,破壞堆元數據
delete[] p; // 報錯:heap corruption / invalid pointer
| 語法 | 含義 | 返回類型 | 適用場景 |
|---|---|---|---|
| `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[]
// ✅ 推薦: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[]` 避免手動內存管理錯誤。