在C++中,静态数组的大小必须在编译期确定,这限制了程序的灵活性。如果我们需要在运行时根据用户输入或计算结果来决定数组长度,就要使用动态数组。动态数组通过new和delete运算符在堆区进行内存分配与释放,从而突破栈空间与编译期长度的限制。

什么是动态数组
动态数组指的是在程序运行期间,通过动态内存分配函数或运算符申请的一段连续内存空间,用来存放多个同类型元素。与局部数组不同,它的生命周期由程序员控制,直到显式释放才归还系统。
用new创建动态数组
C++提供new[]运算符来申请连续内存。语法形式为:指针 = new 类型[元素个数]。申请成功后会返回指向首元素的指针。
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入数组长度: ";
cin >> n;
// 用new[]在堆上创建动态数组
int* arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = i * 2; // 初始化元素
}
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 使用完后必须释放
delete[] arr;
return 0;
}
用delete释放动态数组
使用new[]分配的数组,必须用delete[]释放,而不能只用delete。如果只写delete,则只会调用一次析构函数并释放首元素所在内存,造成其余内存泄漏甚至程序崩溃。
- new 对应 delete
- new[] 对应 delete[]
常见错误写法
int* p = new int[10]; delete p; // 错误:应为 delete[] p; p = NULL; // 建议置空,防止野指针
二维动态数组的创建
有时我们需要动态的二维数组,可以先申请指针数组,再为每个指针申请一维数组。
#include <iostream>
using namespace std;
int main() {
int row = 3, col = 4;
// 创建行指针数组
int** matrix = new int*[row];
for (int i = 0; i < row; i++) {
matrix[i] = new int[col];
}
// 赋值与输出
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
matrix[i][j] = i + j;
cout << matrix[i][j] << " ";
}
cout << endl;
}
// 释放顺序与创建相反
for (int i = 0; i < row; i++) {
delete[] matrix[i];
}
delete[] matrix;
return 0;
}
注意事项与建议
| 问题 | 说明 |
|---|---|
| 忘记释放 | 导致内存泄漏,长期运行程序会耗尽资源 |
| 越界访问 | 动态数组不检查边界,越界会破坏堆结构 |
| 重复释放 | 对同一指针多次delete[]属于未定义行为 |
在现代C++中,更推荐使用std::vector来管理动态数组,它能自动扩容并释放内存。但理解new和delete的底层机制,仍是排查内存问题和阅读旧代码的关键能力。
dynamic_arraynew_deletememory_allocation修改时间:2026-07-29 08:27:36