問題代碼
class DataRow {
vector m_cells;
DataTable* m_parent;
public:
DataRow(int countCells, DataTable& parent)
: m_cells(countCells), m_parent(&parent) { // 期望 size=countCells
vector v1(2); // 正常
vector v3(0); // 正常
}
};
// 實際 m_cells.size() 變成巨大亂數 (1065320319)
原因分析
m_cells(countCells) 調用 vector(size_type n) 建構子,**預設值初始化 n 個元素**(指針為 nullptr),語法正確。
- 若出現亂數,極大可能是編譯器 Bug(如舊版 MSVC 對模板建構子在初始化列表中的處理缺陷),或記憶體破壞(其他地方寫越界覆蓋了
m_cells 的內部指標)。
- 函數體內
v1(2) 正常,說明建構子邏輯無誤,問題局限於初始化列表上下文。
解決與規避方案
- 升級編譯器:VS2015 Update 3 以上、GCC 5+、Clang 3.8+ 已修復相關問題。
- 改用函數體初始化(最穩健):
DataRow(int countCells, DataTable& parent) : m_parent(&parent) {
m_cells.resize(countCells); // 或 m_cells = vector(countCells);
}
- 使用 C++11 列表初始化(若支援):
: m_cells{countCells}, m_parent(&parent) {} // 需確認不觸發 initializer_list 建構子
最佳實踐
- 優先在函數體用
resize/assign 初始化容器,避免初始化列表模板建構子的邊界問題。
- 啟用最高警告等級 (
/Wall / -Wall -Wextra) 並視警告為錯誤。
- 單元測試覆蓋建構邏輯,及早發現記憶體異常。