用 new 分配一维动态数组应写为 int* arr = new int[n];,n 为运行时确定的整型表达式;必须用 delete[] 释放,否则未定义行为;推荐优先使用 std::vector 替代裸 new[]。

new 分配一维动态数组怎么写
用 new 分配一维数组,语法是 int* arr = new int[n];,其中 n 必须是运行时可确定的整型表达式(可以是变量),但不能是带非常量值的 C 风格数组长度(比如 int m[5]; new int[m[0]]; 在某些旧编译器会报错,C++14 起允许,但不推荐依赖)。
常见错误:写成 int* arr = new int(n); —— 这其实是分配单个 int 并初始化为 n,不是数组。括号 () 和方括号 [] 含义完全不同。
-
new int(42)→ 分配 1 个 int,初值为 42 -
new int[42]→ 分配 42 个未初始化的 int -
new int[5]{1,2,3}→ C++11 起支持,前 3 个元素初始化,后 2 个零初始化
delete[] 必须配对使用,否则 UB
用 new[] 分配的数组,必须用 delete[] 释放,写成 delete arr; 看似能编译,但行为未定义(UB)—— 可能当场崩溃、内存泄漏,也可能“暂时正常”,这是最危险的坑。
原因:编译器可能在数组首地址前额外存储大小信息,delete 不读这个元数据,delete[] 才会;析构函数调用逻辑也不同(对类类型尤其关键)。
立即学习“C++免费学习笔记(深入)”;
- 分配:
std::string* sarr = new std::string[10]; - 正确释放:
delete[] sarr; - 错误释放:
delete sarr;→ 类对象的析构函数只调第一个,其余 9 个资源泄漏
new 失败时默认抛出 std::bad_alloc
现代 C++ 中,new 分配失败默认不返回 nullptr,而是抛出 std::bad_alloc 异常。如果你没捕获,程序直接终止。
想获得 nullptr 行为,得显式加 std::nothrow:
int* p = new (std::nothrow) int[1000000];
if (p == nullptr) {
// 处理分配失败
}
注意:std::nothrow 是修饰 new 表达式的,不是函数参数;它不改变分配逻辑,只改失败时的返回方式。
为什么建议优先用 std::vector 而不是 raw new[]
裸 new[]/delete[] 容易漏掉 delete[]、异常安全差、无法自动扩容、没有迭代器接口——这些都不是“进阶问题”,而是日常写错的高发区。
std::vector 在栈上只存控制块(指针+size+capacity),数据仍在堆上,性能几乎无损,但语义清晰、异常安全、支持移动、可直接传参和返回:
-
std::vector<int> v(n);</int>→ 分配 n 个默认初始化 int -
v.resize(m);→ 动态调整大小(可能重新分配) - 函数返回
vector?没问题,移动语义自动触发
只有极少数场景(如与 C API 交互、定制内存池、嵌入式严格控制分配路径)才需要手写 new[]。










