new分配一维动态数组的正确写法是int* arr = new int[10];,必须用方括号指定元素个数,且只能用delete[]释放;漏掉[]、用错delete或空维度均错误;推荐优先使用std::vector替代。

new 分配一维动态数组的正确写法
用 new 创建动态数组,必须显式指定元素个数,并用方括号 [] 包裹类型——这是和单个对象分配最核心的区别。漏掉 [] 会导致后续 delete 行为未定义,且无法正确析构多个对象。
-
int* arr = new int[10];✅ 正确:分配 10 个int的连续内存 -
int* arr = new int(10);❌ 错误:只分配 1 个int并初始化为 10 -
int* arr = new int[];❌ 错误:C++ 不支持空维度数组(编译失败)
构造函数会自动调用(对类类型),例如 std::string* strs = new std::string[5]; 会调用 5 次默认构造函数。
必须用 delete[] 释放,否则有严重风险
用 new[] 分配的内存,**只能**用 delete[] 释放。用 delete(无方括号)释放会导致:
- 仅调用第一个元素的析构函数(类类型)
- 底层内存释放行为未定义,可能崩溃或静默损坏堆
- Valgrind / AddressSanitizer 会直接报
Mismatched free() / delete / delete[]
int* arr = new int[100]; // ... 使用 delete[] arr; // ✅ 必须带 [] // delete arr; // ❌ 绝对禁止
new 失败时抛出异常,不是返回 nullptr
默认情况下,new 在内存不足时不返回 nullptr,而是抛出 std::bad_alloc 异常。如果没捕获,程序会终止。
立即学习“C++免费学习笔记(深入)”;
- 想获得
nullptr行为,必须显式使用nothrow版本:int* p = new (std::nothrow) int[1000]; - 此时若失败,
p为nullptr,需手动检查:if (!p) { /* 处理失败 */ } - 现代 C++ 更推荐用
std::vector替代裸new[],它自动处理异常安全与释放
为什么不要手动管理动态数组?
裸 new[] + delete[] 容易遗漏、配对错误、异常中断导致泄漏。比如:
int* arr = new int[n]; do_something(); // 若这里抛异常,delete[] 就永远不会执行 delete[] arr;
而 std::vector 是栈对象,析构自动释放内存,且支持移动、容量控制、边界检查(at()):
std::vectorarr(n); // 分配 n 个 int,自动初始化 arr.resize(m); // 动态调整大小 // 函数结束自动释放,无需 delete
除非在极少数嵌入式或性能敏感场景且明确控制生命周期,否则优先用 std::vector 或 std::unique_ptr。










