在C++编程中,处理运行时才能确定大小的二维数组时,需要借助动态内存分配来实现,new操作符是最常用的动态分配工具,不同的写法对应不同的内存布局和使用场景。

非连续内存分配方式
这种方式先分配一个指针数组,每个指针再指向对应行的数组,内存不是连续的,实现起来比较简单,适合新手理解。
分配写法
假设要分配rows行cols列的int类型二维数组,写法如下:
#include <iostream>
using namespace std;
int main() {
int rows = 3;
int cols = 4;
// 第一步:分配行指针数组
int** arr = new int*[rows];
// 第二步:为每一行分配列数组
for (int i = 0; i < rows; i++) {
arr[i] = new int[cols];
}
// 赋值测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
// 打印测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
释放写法
这种分配方式需要先释放每一行的内存,再释放行指针数组,顺序不能反,否则会导致内存泄漏:
// 先释放每一行的内存
for (int i = 0; i < rows; i++) {
delete[] arr[i];
}
// 再释放行指针数组
delete[] arr;
连续内存分配方式
这种方式分配的二维数组在内存中是连续的,缓存友好性更好,访问效率更高,适合对性能有要求的场景。
分配写法
同样分配rows行cols列的int类型二维数组,实现如下:
#include <iostream>
using namespace std;
int main() {
int rows = 3;
int cols = 4;
// 分配连续的内存块,大小为rows*cols
int* data = new int[rows * cols];
// 分配行指针数组,让每个指针指向对应行的起始位置
int** arr = new int*[rows];
for (int i = 0; i < rows; i++) {
arr[i] = data + i * cols;
}
// 赋值测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
// 打印测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
释放写法
连续分配的内存需要先释放连续的数据块,再释放行指针数组:
// 先释放连续的数据内存 delete[] data; // 再释放行指针数组 delete[] arr;
使用vector替代new的技巧
如果不需要手动管理内存,使用<vector>容器是更安全的选择,不需要手动释放内存,也不会出现内存泄漏的问题:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int rows = 3;
int cols = 4;
// 直接定义二维vector,初始化所有元素为0
vector<vector<int>> arr(rows, vector<int>(cols, 0));
// 赋值测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
// 打印测试
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
注意事项
- 使用new分配内存后一定要对应使用delete释放,避免内存泄漏
- 非连续分配和连续分配的释放顺序不能搞错,否则会导致程序崩溃
- 访问二维数组时注意下标不要超过分配的大小,避免越界访问
- 如果项目允许,优先使用vector管理动态数组,减少手动内存管理的负担