現象
VC6.0 專案編譯通過,運行時彈出錯誤對話框(截圖),功能實際正常。
核心原因
- 指標未初始化:區域指標變數預設隨機值,解參考導致存取違規。
- 指標類型轉換錯誤:將
void* 或基類指標強轉為衍生類指標,但實際物件非該類型。
- 釋放後再使用:
free(p) 或 delete p 後未置 NULL,後續誤用。
- 陣列越界寫入:破壞鄰近變數(含指標),間接導致指標錯誤。
排查步驟
- 啟用 Debug 建置,開啟「偵錯資訊」。
- 運行至錯誤處中斷,觀察「變數監視」視窗中可疑指標值(
0xcdcdcdcd、0xfeeefeee 為未初始化/已釋放標記)。
- 所有指標宣告時初始化:
Type *p = NULL; 或 Type *p = new Type();。
- 使用
ASSERT(p != NULL) 斷言防禦。
VC6 特有提醒
- VC6 編譯器對 C++ 標準支援不全,模板、STL 易產生難以診斷的錯誤,建議升級至 VS2017+。
- 專案設定 → C/C++ → Code Generation → Runtime Library 選 Debug Multithreaded DLL (/MDd) 以獲得完整偵錯堆疊。
總結
「編譯通過、運行報錯」九成以上是指標問題。養成「宣告即初始化、釋放即歸零」習慣,配合 Debug 斷點觀察,可快速定位。