<p>delete[] 不能释放 char* 数组各元素所指内存,仅释放数组本身;每个 char 必须单独用 delete[] 或 delete 释放,且需确保其由 new[] 或 new 分配,严禁释放栈内存或字符串字面量。</p>

delete[] 不能用于 char* 数组的每个元素
如果你声明的是 char** arr(即字符指针数组),每个元素是 char*,那它们各自指向的内存必须单独释放——delete[] arr 只能释放数组本身,对每个 arr[i] 无效,甚至会崩溃。
释放前必须确认每个 char* 是 new[] 分配的
常见错误是混用 new / new[] 和 delete / delete[],或试图释放栈内存、字符串字面量:
-
arr[0] = "hello";→ 绝对不能delete,这是只读常量区 -
arr[1] = new char[10];→ 必须用delete[] arr[1] -
arr[2] = new char(42);→ 必须用delete arr[2](单个对象)
标准循环释放写法(带空指针防护)
假设你有 char** arr 和长度 n,且每个非空元素都由 new char[N] 分配:
for (int i = 0; i < n; ++i) {
delete[] arr[i]; // 注意:不是 delete,也不是 delete[] arr
arr[i] = nullptr; // 防重复释放
}
delete[] arr; // 最后才释放指针数组本身
如果某些元素是 new char(非数组),对应位置就得用 delete arr[i]——类型必须严格匹配。
立即学习“C++免费学习笔记(深入)”;
更安全的替代方案:用 std::vector<:string>
手动管理 char* 容易出错,尤其在异常路径下。现代 C++ 推荐:
- 用
std::vector<:string></:string>存文本,自动管理内存 - 若需 C 风格接口,用
str.c_str()临时获取const char* - 真要动态分配原始内存,至少用
std::unique_ptr<char></char>,避免裸指针
裸 char** 的释放逻辑看似简单,但分配方式不统一、生命周期不清晰时,几乎必然踩 double-free 或 use-after-free 的坑。


















