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

C++ 運算子多載陷阱:operator+ 中數組越界導致死循環/崩潰

     編輯:程式設計疑難解答

錯誤代碼片段

friend Array operator+(Array& s, Array& t) {
    Array r;
    int BIG = big(s, t); // 取較長長度
    for (int i = 0; i < BIG; i++)
        r.a[i] = s.a[i] + t.a[i]; // ❌ 短數組越界訪問
    return r;
}

問題分析

  • BIG 為較長數組長度,迴圈以 BIG 為上限。
  • 短數組 (如長度 3) 訪問 a[3]、a[4]... 導致**未定義行為** (記憶體破壞、死循環、崩潰)。
  • 預設構造函數 Array() 僅分配 1 個 int,r.a 容量極小,寫入即越界。

修正方案

  1. 動態分配結果數組:r.a = new int[BIG]; (需實現拷貝構造/賦值運算子/析構函數遵循 Rule of Three)。
  2. 邊界檢查:迴圈內判斷 i < s.l 與 i < t.l,缺位補 0。
  3. 使用 std::vector:現代 C++ 首選,自動管理記憶體、支援邊界檢查 at()。

修正後邏輯 (手動管理版)

friend Array operator+(Array& s, Array& t) {
    int BIG = max(s.l, t.l);
    Array r(BIG); // 假設有參構造函數分配指定大小
    for (int i = 0; i < BIG; i++) {
        int sv = (i < s.l) ? s.a[i] : 0;
        int tv = (i < t.l) ? t.a[i] : 0;
        r.a[i] = sv + tv;
    }
    r.l = BIG;
    return r;
}

核心教訓

**C++ 手動記憶體管理極易出錯**。除非教學/特殊場景,**生產代碼請直接使用 std::vector、std::string、智能指針** 等標準庫設施。

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