錯誤現象

Visual Studio 2010 運行程序時彈出「Runtime error R6010 - abort() has been called」,程序異常終止。
常見原因分析
- 非法指針訪問 / 內存洩漏:野指針、雙重釋放、訪問已釋放內存
- 指針越界:數組下標越界、緩衝區溢出
- 棧溢出:遞歸過深、大局部數組、無限遞歸
- 多線程資源競爭:無鎖訪問共享資源、死鎖
- CRT 版本不匹配:EXE 與 DLL 混用不同版本 C Runtime Library
- 中文路徑/編碼問題:項目路徑包含中文導致資源加載失敗
- 內存分配失敗:大塊內存申請失敗未檢查返回值
排查與解決步驟
第一步:檢查內存申請與釋放
- 每個
new/malloc 對應 delete/free
- 使用智能指針 (
unique_ptr, shared_ptr) 自動管理
- 檢查是否有內存洩漏工具(VS 內置 _CrtDumpMemoryLeaks)
第二步:檢查棧空間使用
- 避免大數組在棧上分配(改用
static、new 或 vector)
- 遞歸深度過大時改用迭代或增加棧大小(鏈接器 /STACK:reserve,commit)
第三步:指針有效性驗證
- 使用前檢查
ptr != nullptr
- 釋放後置空
ptr = nullptr
- 開啟「運行時檢查」:項目屬性 → C/C++ → 代碼生成 → 基本運行時檢查 → 默認 (/RTC1)
第四步:多線程同步
- 共享數據用
mutex/critical_section 保護
- 檢查是否有競態條件
第五步:CRT 一致性
- 確保所有項目(EXE、DLL)使用相同 CRT:/MD (動態) 或 /MT (靜態),且 Debug/Release 一致
- 屬性 → C/C++ → 代碼生成 → 運行庫
調試技巧
- 啟用「在拋出時中斷」:調試 → 窗口 → 異常設置 → 勾選 C++ 異常
- 使用
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) 自動檢測洩漏
- 風向標:錯誤發生位置往往不是根因,需向上追溯調用棧