面试题答案
一键面试#include <iostream>
// 创建二维数组的函数
int** create2DArray(int m, int n) {
int** arr = new int* [m];
for (int i = 0; i < m; ++i) {
arr[i] = new int[n];
}
return arr;
}
// 释放二维数组内存的函数
void free2DArray(int** arr, int m) {
for (int i = 0; i < m; ++i) {
delete[] arr[i];
}
delete[] arr;
}
int main() {
int m = 3;
int n = 4;
int** array = create2DArray(m, n);
// 写入操作
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
array[i][j] = i * n + j;
}
}
// 读取操作
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
std::cout << array[i][j] << " ";
}
std::cout << std::endl;
}
free2DArray(array, m);
return 0;
}
指针的内存布局分析
int** arr = new int* [m];
:这一步在堆上分配了一个包含m
个int*
类型元素的数组,即m
个指针,这些指针将分别指向m
行的数组。for (int i = 0; i < m; ++i) { arr[i] = new int[n]; }
:在上述步骤分配的m
个指针中,每个指针又分别在堆上分配了一个包含n
个int
类型元素的数组,从而构成了一个m
行n
列的二维数组。
避免内存泄漏的方法
- 释放行指针指向的内存:在
free2DArray
函数中,通过for (int i = 0; i < m; ++i) { delete[] arr[i]; }
释放每一行分配的内存,因为每一行都是通过new int[n]
分配的动态数组,所以使用delete[]
来释放。 - 释放指向行指针的数组内存:使用
delete[] arr;
释放最开始分配的包含m
个int*
类型元素的数组,因为它是通过new int* [m]
分配的,所以同样使用delete[]
来释放。
这样就确保了在使用完动态分配的二维数组后,所有分配的内存都被正确释放,避免了内存泄漏。