学习new与new[]的区别,如何轻松掌握C++内存管理技巧?
- 内容介绍
- 文章标签
- 相关推荐
新手最怕的内存泄漏:为什么必须弄懂 new 与 new 的区别?
在 C++ 项目中,忘记释放堆内存误用删除运算符是导致程序崩溃、性能下降的根本原因。很多开发者只会把 new/delete 当成“魔法词”。却不了解它们背后真正的行为,结果埋下难以定位的 bug。
痛点一:使用 new int 看起来和普通变量没区别,却不清楚它会在堆配内存并调用构造函数。
痛点二:new 创建数组时如果用错了 delete(而不是 delete),析构函数只会被调用一次导致资源泄露。
new为单个对象分配堆内存并自动调用构造函数
new 的完整过程:
-
调用 operator new: 在堆上请求一块未初始化的原始内存。如果分配失败,会抛出
std::bad_alloc)。 - 执行对象构造函数: 把对象初始化为合法状态。
- : 类型安全,无需强制类型转换。
示例代码
// 分配一个 int 并初始化为 5
int *p = new int;// 分配自定义类并调用构造函数
class Widget {
从public来看,Widget : value {}
~Widget { /* 资源释放 */ }
private:
int value;},Widget *w = new Widget;
new: 为数组分配连续的堆空间并批量调用构造函数
new 与单对象版唯一的区别是:
- 一次性申请多个相同类型的对象。
-
C++ 运行时会在内部记录数组长度。以便在
alert delete -
必须使用对应的
delete,否则只能析构第一个元素,引发资源泄漏或未定义行为。
C++ 示例 – 动态数组
// 分配 5 个 Widget。对每个都调用构造函数 Widget *arr = new Widget{ {1},{2},{3},{4},{5} };/* ... 使用 arr ... */ delete arr;// 正确匹配,全部析构
对应的删除运算符:end delete 与 delete
Pain point: 使用错误的删除方式会导致:
- 内存泄漏 。
- 双重释放或未定义行为 。
- 析构函数未被完整执行,外部资源残留。,
正确做法的观点是,
-
delete ptr;// 对应单对象 -
delete arr;// 对应数组
与 C 语言传统方式 的根本区别
| 特性 | malloc / free | new / delete | |
|---|---|---|---|
| 类型安全 | 无 | 有 | |
| 构造/析构 | 不调用 | 自动调用 | |
| 异常处理 | 返回 NULL | 抛出 std::bad_alloc | |
| 重载可能 | operator new 可自定义 | 一样可自定义。 但更常用于类级别管理 | |
| C++ 的 new/delete 在语义层面直接把「分配」和「初始化」绑定,是现代 C++ 推荐的唯一手段。 | |||
实际方法:让你的代码“免疫”内存错误
RAII 与智能指针——把手动 delete 丢进垃圾箱
- :
- :
-
/ make_unique/ && make_shared是首选写法,不会出现 “裸指针” 漏洞。说起来,
至于安全,使用“先创建后赋值”模式防止泄漏
常见错误示例这方面。
// 错误:如果 ctor 抛异常,已分配内存泄漏 Foo* p = new Foo;p->init,不过,// 可能抛异常 delete p;
说到改进方案。
// 推荐:一次性完成所有工作,若抛异常则根本不会返回裸指针 Foo* p = new Foo;// 若 ctor 抛异常,operator new 自动回收已分配内存 // 或者直接交给智能指针 auto p = std::make_unique ;
自定义 operator new/delete —— 为大对象池、对齐需求提供底层支持
如果项目对性能要求极高,可以重载全局或类专属的 operator new/delete。实现:
- 内存对齐
- 对象池复用
常见陷阱快速检查清单
-
用了
::new,却只写了::delete . — 立即改成delete。
**** 混用 C 风格 `malloc` + C++ `delete`
* 忘记 nullptr 检查直接 delete
* 对同一块内存多次 delete
* 将局部栈变量地址传给 new/malloc 再 free
* 所有 new/new 必须有对应 delete/delete最好交给 RAII 管理
小结 – 从“魔法词”到“安全工具” 🛡️)
-
A. 单对象 用
new+Delete;B. 数组 用New+Delete。
C. 两者都负责 **分配+初始化**。而 C 的 `malloc/free` 只负责原始字节,不调 构造/析 析 函 数。
D. **RAII + 智能指针** 是现代 C++ 防止泄漏、异常不安全最简洁可靠的方法;手动 `new/delete` 仅在特殊场景下才需要。
E. 熟练掌握这些细节,你就可以轻松定位 “为什么我的程序在关闭时崩溃?”、“为什么出现莫名其妙的内存增长?” 等常见痛点,让代码既高效又稳健。
K. 最终提醒——**永远让每一次 heap 分配都有对应且匹配的释放**;若不确定,就把它交给智能指针,让编译器帮你完成这件事!🌟祝你玩转 C++ 内存管理,从容面对任何项目挑战!🌟
新手最怕的内存泄漏:为什么必须弄懂 new 与 new 的区别?
在 C++ 项目中,忘记释放堆内存误用删除运算符是导致程序崩溃、性能下降的根本原因。很多开发者只会把 new/delete 当成“魔法词”。却不了解它们背后真正的行为,结果埋下难以定位的 bug。
痛点一:使用 new int 看起来和普通变量没区别,却不清楚它会在堆配内存并调用构造函数。
痛点二:new 创建数组时如果用错了 delete(而不是 delete),析构函数只会被调用一次导致资源泄露。
new为单个对象分配堆内存并自动调用构造函数
new 的完整过程:
-
调用 operator new: 在堆上请求一块未初始化的原始内存。如果分配失败,会抛出
std::bad_alloc)。 - 执行对象构造函数: 把对象初始化为合法状态。
- : 类型安全,无需强制类型转换。
示例代码
// 分配一个 int 并初始化为 5
int *p = new int;// 分配自定义类并调用构造函数
class Widget {
从public来看,Widget : value {}
~Widget { /* 资源释放 */ }
private:
int value;},Widget *w = new Widget;
new: 为数组分配连续的堆空间并批量调用构造函数
new 与单对象版唯一的区别是:
- 一次性申请多个相同类型的对象。
-
C++ 运行时会在内部记录数组长度。以便在
alert delete -
必须使用对应的
delete,否则只能析构第一个元素,引发资源泄漏或未定义行为。
C++ 示例 – 动态数组
// 分配 5 个 Widget。对每个都调用构造函数 Widget *arr = new Widget{ {1},{2},{3},{4},{5} };/* ... 使用 arr ... */ delete arr;// 正确匹配,全部析构
对应的删除运算符:end delete 与 delete
Pain point: 使用错误的删除方式会导致:
- 内存泄漏 。
- 双重释放或未定义行为 。
- 析构函数未被完整执行,外部资源残留。,
正确做法的观点是,
-
delete ptr;// 对应单对象 -
delete arr;// 对应数组
与 C 语言传统方式 的根本区别
| 特性 | malloc / free | new / delete | |
|---|---|---|---|
| 类型安全 | 无 | 有 | |
| 构造/析构 | 不调用 | 自动调用 | |
| 异常处理 | 返回 NULL | 抛出 std::bad_alloc | |
| 重载可能 | operator new 可自定义 | 一样可自定义。 但更常用于类级别管理 | |
| C++ 的 new/delete 在语义层面直接把「分配」和「初始化」绑定,是现代 C++ 推荐的唯一手段。 | |||
实际方法:让你的代码“免疫”内存错误
RAII 与智能指针——把手动 delete 丢进垃圾箱
- :
- :
-
/ make_unique/ && make_shared是首选写法,不会出现 “裸指针” 漏洞。说起来,
至于安全,使用“先创建后赋值”模式防止泄漏
常见错误示例这方面。
// 错误:如果 ctor 抛异常,已分配内存泄漏 Foo* p = new Foo;p->init,不过,// 可能抛异常 delete p;
说到改进方案。
// 推荐:一次性完成所有工作,若抛异常则根本不会返回裸指针 Foo* p = new Foo;// 若 ctor 抛异常,operator new 自动回收已分配内存 // 或者直接交给智能指针 auto p = std::make_unique ;
自定义 operator new/delete —— 为大对象池、对齐需求提供底层支持
如果项目对性能要求极高,可以重载全局或类专属的 operator new/delete。实现:
- 内存对齐
- 对象池复用
常见陷阱快速检查清单
-
用了
::new,却只写了::delete . — 立即改成delete。
**** 混用 C 风格 `malloc` + C++ `delete`
* 忘记 nullptr 检查直接 delete
* 对同一块内存多次 delete
* 将局部栈变量地址传给 new/malloc 再 free
* 所有 new/new 必须有对应 delete/delete最好交给 RAII 管理
小结 – 从“魔法词”到“安全工具” 🛡️)
-
A. 单对象 用
new+Delete;B. 数组 用New+Delete。
C. 两者都负责 **分配+初始化**。而 C 的 `malloc/free` 只负责原始字节,不调 构造/析 析 函 数。
D. **RAII + 智能指针** 是现代 C++ 防止泄漏、异常不安全最简洁可靠的方法;手动 `new/delete` 仅在特殊场景下才需要。
E. 熟练掌握这些细节,你就可以轻松定位 “为什么我的程序在关闭时崩溃?”、“为什么出现莫名其妙的内存增长?” 等常见痛点,让代码既高效又稳健。
K. 最终提醒——**永远让每一次 heap 分配都有对应且匹配的释放**;若不确定,就把它交给智能指针,让编译器帮你完成这件事!🌟祝你玩转 C++ 内存管理,从容面对任何项目挑战!🌟

![学习new与new[]的区别,如何轻松掌握C++内存管理技巧?](/imgrand/mK1qfQk2.webp)