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

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];
  • 此时若失败,pnullptr,需手动检查:if (!p) { /* 处理失败 */ }
  • 现代 C++ 更推荐用 std::vector 替代裸 new[],它自动处理异常安全与释放

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

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