new和delete必须严格成对且类型匹配:单个对象用new/delete,数组用new[]/delete[];混用导致未定义行为;推荐用unique_ptr/shared_ptr自动管理,避免内存泄漏与悬空指针。

new和delete必须成对使用,且类型要严格匹配。用new[]分配的数组必须用delete[]释放,否则行为未定义。
new和delete的基本配对规则
每次调用new,都应有且仅有一个对应的delete;每次new[],必须配delete[]。
- 用red">new int申请单个对象 → 必须用delete ptr
- 用new int[10]申请数组 → 必须用delete[] ptr
- 混用(如new[]配delete)会导致内存泄漏、堆损坏或程序崩溃
避免裸指针管理,优先用智能指针
手动配对容易出错,C++11起推荐用std::unique_ptr和std::shared_ptr自动管理。
-
std::unique_ptr
p(new int(42)); —— 析构时自动delete -
std::unique_ptr
arr(new int[100]); —— 自动调用delete[] - 不再需要显式调用delete,也无需担心忘记释放或重复释放
禁止对同一指针多次delete
delete后指针变成悬空指针,再次delete会引发未定义行为。
立即学习“C++免费学习笔记(深入)”;
- 释放后立即将指针置为nullptr: delete p; p = nullptr;
- 用智能指针可彻底规避该问题(移动后原指针自动为空)
- 注意:delete nullptr是安全的,但delete已释放过的非空指针不行
类中自定义new/delete需格外谨慎
重载类的operator new/delete时,必须确保与全局版本行为一致,并严格匹配数组/非数组版本。
- 若重载了operator new[],必须同时提供operator delete[]
- 异常安全要考虑:若构造函数抛异常,operator new分配的内存需由对应operator delete回收
- 除非有明确性能或布局需求,否则不建议自行重载
基本上就这些。核心是配对、匹配、自动化。写C++时少用裸new/delete,多靠RAII和智能指针兜底。










