用 new 创建一维数组需写 int* arr = new int[10];,漏方括号会创建单个 int;必须用 delete[] 释放,否则未定义行为;优先用 std::vector 或 std::unique_ptr 管理。

new 创建一维数组的基本语法和常见错误
用 new 创建一维数组,必须显式指定元素个数,且类型后要加方括号:int* arr = new int[10];。漏掉方括号(比如写成 new int(10))会创建单个 int 并初始化为 10,不是数组——这是新手最常踩的坑。
编译器不会帮你检查数组长度是否为正数或可计算,若传入负值或未定义值(如未初始化的变量),行为未定义,运行时可能崩溃或静默出错。
-
new int[n]分配未初始化的int数组(值是随机的) -
new int[n]()加一对空括号,会做值初始化(int变成 0) - 不能用
new int[5]{1,2,3}这种带初始化列表的写法(C++11 起仅支持栈上数组或std::vector)
delete[] 必须配对使用,否则内存泄漏或 UB
用 new[] 分配的数组,必须用 delete[] 释放;只写 delete arr; 是严重错误:它只析构第一个元素(如果类型有析构函数),且底层可能读取错误的元数据,导致堆损坏或程序崩溃。
即使数组元素是 int 这种 POD 类型,也必须写 delete[] —— 释放逻辑依赖分配方式,不是依赖类型。
- 正确:
int* p = new int[100]; ... delete[] p; - 错误:
delete p;(编译不报错,但行为未定义) - 更隐蔽的错误:把
new[]指针赋给非原始指针类型(如void*)后再delete[],可能丢失数组信息
和 std::vector 对比:什么情况下真该用 new
除非你在写底层容器、对接 C API、或明确需要手动控制内存布局(比如对齐、placement new),否则优先用 std::vector。它自动管理生命周期、支持拷贝/移动、能动态扩容,且不会因忘记 delete[] 导致泄漏。
new int[n] 的唯一优势是:分配一块连续裸内存,无额外成员开销、无构造函数调用开销(对 trivial 类型)。但代价是:你得自己记长度(new 不存大小)、自己管释放、无法安全传递所有权。
- 需要传给只接受
int*和长度参数的 C 函数?new可行,但记得把长度单独传过去 - 想让数组在多个函数间共享且自动释放?用
std::vector或std::unique_ptr<int></int> - 误以为
new比vector“更快”?实测中差异通常可忽略,且vector的 cache 局部性更好
用 unique_ptr 管理 new[] 更安全
如果非要用 new[] 但又怕手滑漏掉 delete[],可用 std::unique_ptr 的数组特化版本:
auto arr = std::unique_ptr<int>(new int[100]); // 自动调用 delete[],无需手动清理 </int>
注意:必须写 unique_ptr<int></int>,不能写 unique_ptr<int></int>,否则析构时仍调用 delete 而非 delete[]。
- 不能用
make_unique<int>(n)</int>(C++14 起才支持,且早期编译器可能不全) - 获取裸指针用
arr.get(),别直接用&arr[0](虽等价但易误解) - 数组长度仍需你自己记录,
unique_ptr不提供.size()
实际项目里,new[] 和 delete[] 很少单独出现;一旦涉及动态数组,边界检查、异常安全、多线程访问这些事就立刻浮上来——而这些,std::vector 都已处理好了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











