在 C++ 開發中,靜態數組雖然效率高,但大小在編譯期固定,無法適應運行時數據量變化的場景。例如建立工廠工人資料庫時,各車間人數不一,若用靜態數組必須預估上限,不僅浪費記憶體,還會因上限不足導致維護成本高昂(需重新編譯、分發更新)。動態數組基於堆內存分配,大小可在運行期按需調整,完美解決這些問題。
我們設計模板類 Dynamic1Dim<T>,通過重載 operator[] 實現「越界自動擴容」:
template <typename T>
class Dynamic1Dim {
public:
Dynamic1Dim(); ~Dynamic1Dim();
T& operator[](int index);
protected:
bool EnlargeDim(int newSize);
T* m_pBuf;
int m_iSize;
};
malloc + placement new 構造對象。EnlargeDim 擴容。realloc 擴展內存,對新增區域逐個調用 placement new 初始化。m_pBuf[i].~T()),再 free 釋放內存,防止成員內存洩漏。二維動態數組本質是「動態一維數組的動態數組」。模板類 Dynamic2Dim<T> 內部持有 Dynamic1Dim<T>* 指針陣列:
template <typename T>
class Dynamic2Dim {
public:
Dynamic2Dim(); ~Dynamic2Dim();
Dynamic1Dim<T>& operator[](int row);
protected:
bool EnlargeY(int newRowCount);
int m_iYSize;
Dynamic1Dim<T>* m_pYBuf;
};
operator[](row) 檢查行索引,不足則調用 EnlargeY 擴展行指針陣列,新行自動為長度 1 的一維動態數組。Dynamic1Dim<T>& 再觸發其 operator[](col) 完成列擴展,實現 m_dim[4][10] = 710 這樣的鏈式操作。這種設計完全模擬靜態數組的 arr[i][j] 語法,卻擁有完全動態的大小調整能力,且正確處理了構造/析構語義,是 C++ 模板元編程與手動內存管理結合的經典範例。