贝利信息

c++中如何实现动态数组_c++动态内存分配new用法

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

new 分配一维动态数组的正确写法

new 创建动态数组,必须显式指定元素个数,并用方括号 [] 包裹类型——这是和单个对象分配最核心的区别。漏掉 [] 会导致后续 delete 行为未定义,且无法正确析构多个对象。

构造函数会自动调用(对类类型),例如 std::string* strs = new std::string[5]; 会调用 5 次默认构造函数。

必须用 delete[] 释放,否则有严重风险

new[] 分配的内存,**只能**用 delete[] 释放。用 delete(无方括号)释放会导致:

int* arr = new int[100];
// ... 使用
delete[] arr;  // ✅ 必须带 []
// delete arr;  // ❌ 绝对禁止

new 失败时抛出异常,不是返回 nullptr

默认情况下,new 在内存不足时不返回 nullptr,而是抛出 std::bad_alloc 异常。如果没捕获,程序会终止。

立即学习“C++免费学习笔记(深入)”;

为什么不要手动管理动态数组?

new[] + delete[] 容易遗漏、配对错误、异常中断导致泄漏。比如:

int* arr = new int[n];
do_something();  // 若这里抛异常,delete[] 就永远不会执行
delete[] arr;

std::vector 是栈对象,析构自动释放内存,且支持移动、容量控制、边界检查(at()):

std::vector arr(n);     // 分配 n 个 int,自动初始化
arr.resize(m);               // 动态调整大小
// 函数结束自动释放,无需 delete

除非在极少数嵌入式或性能敏感场景且明确控制生命周期,否则优先用 std::vectorstd::unique_ptr