#include <iostream>
#include <cstdlib>
// 动态分配三维数组并按规则初始化
int*** createAndInitialize3DArray(int x, int y, int z) {
int*** array = new int**[x];
for (int i = 0; i < x; ++i) {
array[i] = new int*[y];
for (int j = 0; j < y; ++j) {
array[i][j] = new int[z];
for (int k = 0; k < z; ++k) {
array[i][j][k] = i * j * k;
}
}
}
return array;
}
// 释放三维数组的内存
void delete3DArray(int*** array, int x, int y) {
for (int i = 0; i < x; ++i) {
for (int j = 0; j < y; ++j) {
delete[] array[i][j];
}
delete[] array[i];
}
delete[] array;
}
int main() {
int x = 2, y = 3, z = 4;
int*** arr = createAndInitialize3DArray(x, y, z);
// 输出部分元素验证结果
std::cout << "arr[1][2][3] = " << arr[1][2][3] << std::endl;
delete3DArray(arr, x, y);
return 0;
}
内存管理问题阐述
- 内存分配:在动态分配多维数组时,需要逐步分配每一维的内存。如上述代码,先分配最外层数组指针,再依次分配内层数组指针和实际元素内存。如果分配过程中出现内存不足,需要适当处理错误(如返回
nullptr
并提示错误)。
- 内存释放:释放内存时,顺序必须与分配顺序相反。先释放最内层数组,再释放中间层数组指针,最后释放最外层数组指针。如果释放顺序错误,可能导致内存泄漏。
- 避免悬空指针:在释放内存后,应将指针设置为
nullptr
,以避免悬空指针。悬空指针指向已释放的内存,可能导致程序崩溃或未定义行为。