技术问询:new与new[]的区别——int* arr=new int[5]与int* arr=new int()的差异
new 与 new[] 运算符的核心区别及代码实例解析 Hey,我来帮你拆解清楚这两个C++运算符的差异,还有你提到的两行代码的具体不同——这是基础但很容易踩坑的知识点:
一、new 和 new[] 的通用区别
- 分配目标不同:
new专门用于分配单个对象的内存,不管是内置类型(int、char等)还是自定义类对象。new[]是为同类型对象数组分配连续的内存块,用来创建动态数组。
- 初始化行为差异:
- 对于自定义类:
new会调用一次类的构造函数;new[]会为数组中的每个元素都调用一次构造函数。 - 对于内置类型:
new不加括号时是未初始化(值为垃圾值),加括号如new int()会值初始化为0;new[]默认也是未初始化,但若写成new int[5](),会把数组里的每个元素都初始化为0。
- 对于自定义类:
- 释放规则必须配对:
这是最关键的点!用new分配的内存必须用delete释放;用new[]分配的内存必须用delete[]释放。尤其是自定义类数组,delete[]会逐个调用元素的析构函数,用错会导致内存泄漏或未定义行为——哪怕是内置类型,也建议严格配对,养成好习惯。
二、int* arr = new int [5]; 与 int* arr = new int(); 的具体差异
这两行代码虽然都返回int*指针,但本质天差地别:
- 内存分配规模:
new int[5]:分配了能容纳5个int的连续内存,总大小为5 * sizeof(int)(通常是20字节,取决于平台)。new int():只分配单个int的内存,大小为sizeof(int)(通常4字节)。
- 初始化状态:
new int[5]:因为是内置类型且未加括号,数组里的5个int都是未定义的垃圾值,直接使用会导致不可预测的结果,必须手动赋值后再用。new int():加了括号触发值初始化,这个单个int会被设置为0,可直接使用。
- 释放方式要求:
- 前者必须用
delete[] arr;释放,哪怕是int数组,也别偷懒用delete——万一以后改成自定义类数组,就会出大问题。 - 后者用
delete arr;释放即可。
- 前者必须用
- 使用场景:
new int[5]用于创建运行时确定大小的动态int数组,比如需要根据用户输入调整数组长度的场景。new int()相当于动态分配了一个初始化为0的int变量,类似动态版的int x = 0;。
内容的提问来源于stack exchange,提问作者praveen chaudhary
相关产品推荐
相关产品推荐

