delete 不会销毁指针本身,只释放其指向的堆内存,指针变为悬空指针;必须手动置 nullptr 以避免未定义行为;new/delete 必须严格配对,混用导致未定义行为;重复 delete 同一指针引发崩溃或数据损坏;释放后访问对象成员绝对非法;推荐使用 RAII 和智能指针替代裸指针。

delete 会销毁指针本身吗?
不会。delete 销毁的是指针所指向的堆内存对象,不是指针变量本身。指针变量(比如 p)在栈上,delete p; 后它依然存在,只是变成悬空指针(dangling pointer)——值没变,但指向的内存已释放,再次解引用会触发未定义行为。
常见错误现象:delete p; 后继续用 *p 或 p->func(),程序可能崩溃、静默出错或看似正常,极难复现。
- 必须在
delete后手动置空:delete p; p = nullptr; - 如果指针是局部变量,函数返回后自动销毁;如果是类成员,需在析构函数中处理
- 不能对
nullptr调用delete—— 虽然 C++ 标准允许(无效果),但掩盖逻辑缺陷,建议先判空再删
new 和 delete 必须配对使用吗?
必须,且类型和形式要严格匹配。用 new 分配,就得用 delete 销毁;用 new[] 分配数组,就必须用 delete[] 销毁。
错误示例:int* p = new int[10]; delete p; —— 行为未定义,可能只调用一次析构、漏释放内存、或破坏堆管理结构。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
new T→delete p -
new T[n]→delete[] p - 混用会导致内存泄漏或运行时崩溃,尤其在含构造/析构的类类型中更危险
- 现代 C++ 更推荐用
std::vector或std::unique_ptr自动管理,避免手写new/delete
多次 delete 同一个指针会发生什么?
未定义行为。典型表现是程序立即崩溃(如 double free or corruption 错误)、段错误(Segmentation fault),或更隐蔽的数据损坏。
根本原因:堆分配器通常维护元数据,重复释放会破坏这些结构。即使第一次 delete 后把指针设为 nullptr,也仅防二次解引用,不解决多线程下竞态删除问题。
- 确保每个动态对象只被
delete一次 - 共享所有权场景(如多个指针指向同一块内存)必须用
std::shared_ptr,不要裸指针 - 调试时可启用 AddressSanitizer(
-fsanitize=address)捕获 double-free
delete 之后还能访问对象成员吗?
绝对不行。哪怕只是读取 p->x 或取地址 &p->x,都属于未定义行为。编译器可能优化掉后续访问,也可能读到旧值、垃圾值,或触发硬件异常。
容易被忽略的点:有些代码看似“安全”,比如 if (p) { delete p; },但若 p 是野指针(非 nullptr 但指向已释放内存),这个判断毫无意义。
- 释放后立即置空是最低成本防御,但不能替代所有权设计
- 成员函数内部若用
this访问成员,delete obj;后调用obj->method()同样非法 - RAII 是根本解法:把资源生命周期绑定到作用域,让析构函数自动
delete

















