new char[] 分配的内存必须用 delete[] 释放,否则是未定义行为;即使只存一个字符、指针为空或为 char 类型,也必须严格配对,不可混用 malloc/free 或 delete,推荐优先使用 std::vector 或 std::string。
![c++动态字符数组new char[]怎么正确释放](https://img.php.cn/upload/article/001/221/864/179016330636840.png?x-oss-process=image/resize,p_40)
用 new char[] 分配的内存必须用 delete[] 释放
这是最核心的规则:哪怕数组里只存一个字符,只要用了 new char[n],就必须配对使用 delete[] p。用 delete p(不带方括号)是未定义行为,常见表现是程序崩溃、内存泄漏或后续 new 失败,但不一定当场报错,容易被忽略。
原因在于:new[] 可能在分配时额外记录数组长度等元数据,delete[] 才会去读取并正确析构(虽然 char 无析构函数,但运行时仍依赖该机制)。编译器不会帮你纠正这个错误。
释放前检查指针是否为空、是否重复释放
delete[] 对空指针是安全的(C++标准保证),所以无需显式判空;但重复释放同一非空指针会导致严重问题,比如堆损坏。
- 释放后立即将指针置为
nullptr,避免野指针误用 - 不要对同一块内存多次调用
delete[] - 不要混用
malloc/free和new[]/delete[]
示例:
char* buf = new char[1024]; // ... 使用 buf delete[] buf; buf = nullptr; // 释放后清空
别把 std::string 或栈数组当成 new char[] 来 delete[]
常见误操作:把 std::string::c_str() 返回的指针、或函数内局部 char buf[256] 的地址,拿去 delete[] —— 这些根本不是 new[] 分配的,结果不可预测。
-
std::string s = "hello"; delete[] s.c_str();→ 错误!c_str()指向内部管理内存,由string自己负责 -
char local[100]; delete[] local;→ 错误!栈内存不能用delete[] -
char* p = (char*)malloc(100); delete[] p;→ 错误!必须用free(p)
现代 C++ 中更推荐用 std::vector<char></char> 或 std::string
手动管理 new char[] 容易出错,且难以应对异常安全场景。如果确实需要动态字节数组:
- 用
std::vector<char></char>替代:自动管理内存,支持移动,可直接取.data() - 纯文本场景优先用
std::string:语义清晰,容量自动增长,避免越界风险 - 仅在极少数必须与 C API 交互(如
read(),recv())且需大缓冲区时,才考虑new char[],且务必严格配对delete[]
真正难的不是写对 delete[],而是确保所有路径(包括异常分支)都执行到它 —— 这正是智能指针和 RAII 容器存在的意义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











