首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 初始化列表構造指定大小 vector 的正確姿勢與編譯器坑點

     編輯:程式設計綜合問答

問題代碼

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) 正常,說明建構子邏輯無誤,問題局限於初始化列表上下文。

解決與規避方案

  1. 升級編譯器:VS2015 Update 3 以上、GCC 5+、Clang 3.8+ 已修復相關問題。
  2. 改用函數體初始化(最穩健):
    DataRow(int countCells, DataTable& parent) : m_parent(&parent) {
        m_cells.resize(countCells); // 或 m_cells = vector(countCells);
    }
    
  3. 使用 C++11 列表初始化(若支援):
    : m_cells{countCells}, m_parent(&parent) {} // 需確認不觸發 initializer_list 建構子
    

最佳實踐

  • 優先在函數體用 resize/assign 初始化容器,避免初始化列表模板建構子的邊界問題。
  • 啟用最高警告等級 (/Wall / -Wall -Wextra) 並視警告為錯誤。
  • 單元測試覆蓋建構邏輯,及早發現記憶體異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved