未經處理的異常: 0xC0000005: 讀取位置 0x0000002C 時發生訪問沖突。
atlsimpstr.h: CStringData* GetData() { return (CStringData*)(m_pszData) - 1; }
m_pszData == 0x0000002C 即 44 字節偏移,說明 CString 內部指針指向已釋放或未初始化的內存。典型場景:
void Func() {
CString s = GetString(); // 返回局部對象引用
Use(s); // s 已析構,內存釋放
}
CArray arr;
arr.Add(new CString("temp"));
// 別處 delete 了指針,arr 仍持有野指針
gflags /p /enable MyApp.exe /full,崩潰點精確定位到錯誤釋放處。atlsimpstr.h,向上找到業務代碼行。| 模式 | 錯誤代碼 | 修正代碼 |
|---|---|---|
| 返回局部引用 | CString& Get() { CString s; return s; } | CString Get() { return CString("val"); } (返回值優化) |
| 容器存指針 | CArray | CArray 或 std::vector |
| 跨模塊 | DLL 導出 CString | 導出 const char* / BSTR,調用端構造 CString |
CString 值語義,避免裸指針。CArray、std::vector)。