首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 實戰:動態分配二維/三維數組的標準姿勢(RAII 封裝版)

     編輯:關於C語言

C++ 實戰:動態分配二維/三維數組的標準姿勢(RAII 封裝版)

C++ 手動管理多維動態數組極易內存洩漏、越界。本文展示工業級做法:封裝類 + 構造/析構函數(RAII)+ new[]/delete[] 配對,實現安全、直觀的二維/三維數組操作。

核心設計原則

  1. 所有權語義:類獨享內存,析構函數自動釋放
  2. 連續分配優化:二維數組可一次性分配 m*n 塊,再建指針索引層(本文採用教學常見的逐行分配,便於理解)
  3. 禁止拷貝/移動:或實現深拷貝,避免雙重釋放(本文簡化省略)

二維數組類 DynamicArray

// 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

// 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] + 指針運算計算索引,提升緩存命中率
  • std::vector/std::unique_ptr:現代 C++ 首選,自動管理生命週期
  • 邊界檢查:重載 operator() 或 at() 提供安全訪問
  • 移動語義:實現移動構造/賦值,實現零拷貝傳遞

掌握這套「構造分配、析構釋放、逐層 new/delete[] 配對」模式,是 C++ 程序員處理動態多維數組的必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved