MFC 開發中,CString 在 Debug 版出現 _free_dbg(p, _NORMAL_BLOCK) 斷言失敗,Release 版卻正常,通常源於以下兩種情況:
GetBuffer() 取得內部緩衝區指標後,必須配對呼叫 ReleaseBuffer()。若中途拋出異常、提前返回或邏輯分支漏掉釋放,會導致記憶體狀態不一致,Debug 執行期檢查即會捕獲。
在全域函數或靜態儲存期物件中使用局部 CString 變數,其解構順序可能早於 MFC 內部記憶體管理模組的清理,導致重複釋放或釋放已釋放記憶體。Debug 版的堆積檢測會報錯,Release 版則可能默默掩蓋。
GetBuffer 呼叫是否有對應的 ReleaseBuffer,建議用 RAII 包裝器自動管理。CString;改用動態分配或延遲初始化(如 CString* + new,在 InitInstance 中建構)。_CRTDBG_MAP_ALLOC 與 _CrtDumpMemoryLeaks 定位具體洩漏點。Debug 版的嚴格檢查正是及早發現資源管理缺陷的利器,切勿因 Release 版「不報錯」而掉以輕心。