new和delete必须严格成对使用:new配delete、new[]配delete[],混用或与malloc/free混用将导致未定义行为;释放后访问为野指针;new/delete自动调用构造/析构函数,资源管理需谨慎。

new 和 delete 必须成对出现,否则必然泄漏或崩溃
用 new 分配的内存,必须用 delete 释放;用 new[] 分配的数组,必须用 delete[] 释放。混用会触发未定义行为——常见表现是程序在某些编译器下看似正常,换一个环境就崩,或者只崩在 Release 模式。
-
new int→ 必须delete ptr,不能delete[] ptr -
new int[10]→ 必须delete[] ptr,不能delete ptr - 用
malloc分配的不能用delete,反之亦然 - 释放后继续访问
ptr(即“野指针”)不会报错,但结果不可预测
构造函数和析构函数在 new/delete 中自动调用
new 不只是分配内存,它会先调用 operator new 分配原始内存,再在该地址上调用对象的构造函数;delete 则先调用析构函数,再调用 operator delete 归还内存。这意味着:如果类里有资源(如文件句柄、动态数组),析构函数没写对,delete 就没法清理干净。
- 自定义类中若含裸指针成员,析构函数里必须
delete它(且确保不重复释放) - 拷贝构造/赋值运算符没写,可能造成两个对象指向同一块堆内存,
delete一次后另一对象再delete就崩 - 用
new创建对象时传参,如new MyClass(42),参数会传给对应构造函数
new 可能抛异常,不处理就会终止程序
默认情况下,new 在内存不足时抛 std::bad_alloc,而不是返回 nullptr。很多老代码习惯性检查 if (ptr == nullptr),这在 C++ 默认行为下完全无效。
- 想让它返回
nullptr而非抛异常,得显式用new (std::nothrow) int[100] - 捕获异常要写
try { ... } catch (const std::bad_alloc& e) { ... },不能只 catch... - 在嵌入式或实时系统中,常禁用异常,此时必须搭配
std::nothrow使用
不要在类内部重载 operator new/delete,除非你清楚所有副作用
重载类专属的 operator new 看似能优化分配,但实际容易踩坑:全局 new 的行为和类内重载不一致;多态对象用基类指针 new 子类时,若基类没声明虚析构函数,delete 可能只调基类析构;更麻烦的是,重载后忘记同步重载 operator new[] 和 operator delete[],数组操作直接 UB。
立即学习“C++免费学习笔记(深入)”;
- 除非做内存池或调试追踪,否则别碰类内重载
- 若真要重载,必须四者齐备:
operator new、operator delete、operator new[]、operator delete[] - 重载函数里调用全局版本要用作用域解析符:
::operator new(size)
手动管理堆内存的核心不是“会不会写 new/delete”,而是每处分配都要明确生命周期归属。最容易被忽略的是:跨函数传递裸指针时,谁负责 delete?这个责任一旦模糊,问题就藏在最深的调用栈里。









