在 CDialog 派生類中添加 CStringList m_strList 或 CStringArray m_strArray 作為成員變數。
現象 1: 僅添加 CStringList 變數 (未使用),程式結束時拋出「未處理的異常」。
現象 2: 添加 CStringArray 變數,程式啟動初期即崩潰。
這**不是** MFC 容器類本身的 Bug,而是典型的**記憶體損壞 / 堆疊破壞** 症狀延遲爆發。
CStringArray 內部可能預分配記憶體或結構佈局不同,導致在建構階段 (程式啟動) 就觸碰到「地雷」;CStringList 初始較輕量,拖到解構階段 (程式結束) 才引爆。在 stdafx.h 或專案主 .cpp 最開頭加入:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
並在 InitInstance 或 main 開頭加入:
afxMemDF |= checkAlwaysMemDF; // 每次記憶體操作都檢查
// 或更嚴格
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
效果: 程式會在**破壞發生的那一刻**斷點中斷,而非等到容器解構時才崩潰,直接定位到真正寫壞記憶體的程式碼行。
CArray, CList, CMap 等容器巢狀使用且未正確複製 (需實作 CopyElements 或使用指標容器 CTypedPtrArray)。char buf[10]; strcpy(buf, "超過10字元的字串");for(int i=0; i<=count; i++) arr[i]=...; (應為 < count)p += sizeof(MyStruct) 應為 p++。sprintf(buf, "%s", longStr); → 改用 sprintf_s / CString::Format。**「新增一個未使用的成員變數就崩潰」鐵定是記憶體越界/野指標導致的堆疊/堆損壞。** 容器只是剛好佔用了被破壞的記憶體區塊。請優先開啟 DEBUG_NEW + checkAlwaysMemDF,或在 Visual Studio 中使用「資料斷點」精準鎖定兇手。切勿誤以為是 MFC 容器類的問題而嘗試換容器類型,那只會換個時間點崩潰。