C++ 手動管理多維動態數組極易內存洩漏、越界。本文展示工業級做法:封裝類 + 構造/析構函數(RAII)+ new[]/delete[] 配對,實現安全、直觀的二維/三維數組操作。
m*n 塊,再建指針索引層(本文採用教學常見的逐行分配,便於理解)// DynamicArray.h
class DynamicArray {
public:
DynamicArray(int m = 5, int n = 5); // 默認 5x5
~DynamicArray();
void printArray() const;
private:
int **m_pArray; // 指針數組:指向每行
int m_iSize, n_iSize; // 行數、列數
};
// DynamicArray.cpp
DynamicArray::DynamicArray(int m, int n) : m_iSize(m), n_iSize(n) {
m_pArray = new int*[m_iSize]; // 分配行指針數組
for (int i = 0; i < m_iSize; ++i)
m_pArray[i] = new int[n_iSize]; // 逐行分配列數據
// 初始化測試數據:a[i][j] = i + 10*j
for (int i = 0; i < m_iSize; ++i)
for (int j = 0; j < n_iSize; ++j)
m_pArray[i][j] = i + 10 * j;
}
DynamicArray::~DynamicArray() {
for (int i = 0; i < m_iSize; ++i)
delete[] m_pArray[i]; // 先釋放每行
delete[] m_pArray; // 再釋放行指針數組
}
void DynamicArray::printArray() const {
for (int i = 0; i < m_iSize; ++i) {
for (int j = 0; j < n_iSize; ++j)
std::cout << m_pArray[i][j] << ' ';
std::cout << '\n';
}
}
// DynamicArray3d.h
class DynamicArray3d {
public:
DynamicArray3d(int m = 5, int n = 5, int o = 5);
~DynamicArray3d();
void printArray() const;
private:
int ***m_pArray; // 三級指針
int m_iSize, n_iSize, o_iSize;
};
// DynamicArray3d.cpp
DynamicArray3d::DynamicArray3d(int m, int n, int o)
: m_iSize(m), n_iSize(n), o_iSize(o) {
m_pArray = new int**[m_iSize]; // 第一維:平面指針
for (int i = 0; i < m_iSize; ++i)
m_pArray[i] = new int*[n_iSize]; // 第二維:行指針
for (int i = 0; i < m_iSize; ++i)
for (int j = 0; j < n_iSize; ++j)
m_pArray[i][j] = new int[o_iSize]; // 第三維:數據
// 初始化:a[i][j][k] = i*100 + j*10 + k
for (int i = 0; i < m_iSize; ++i)
for (int j = 0; j < n_iSize; ++j)
for (int k = 0; k < o_iSize; ++k)
m_pArray[i][j][k] = i*100 + j*10 + k;
}
DynamicArray3d::~DynamicArray3d() {
for (int i = 0; i < m_iSize; ++i) {
for (int j = 0; j < n_iSize; ++j)
delete[] m_pArray[i][j]; // 釋放數據行
delete[] m_pArray[i]; // 釋放行指針
}
delete[] m_pArray; // 釋放平面指針
}
void DynamicArray3d::printArray() const {
for (int i = 0; i < m_iSize; ++i) {
for (int j = 0; j < n_iSize; ++j) {
for (int k = 0; k < o_iSize; ++k)
std::cout << m_pArray[i][j][k] << ' ';
std::cout << " "; // 列組分隔
}
std::cout << '\n';
}
}
int main() {
DynamicArray a(3, 4); // 3行4列
a.printArray();
DynamicArray3d b(2, 3, 4); // 2層3行4列
b.printArray();
return 0; // 自動調用析構函數釋放內存
}
new int[m*n] + 指針運算計算索引,提升緩存命中率operator() 或 at() 提供安全訪問掌握這套「構造分配、析構釋放、逐層 new/delete[] 配對」模式,是 C++ 程序員處理動態多維數組的必修內功。