使用偵錯版檢查記憶體覆寫
若要使用偵錯組建來檢查記憶體覆寫,您必須先重建專案以進行偵錯。 然後,移至應用程式函 InitInstance
式的開頭,並新增下列這一行:
afxMemDF |= checkAlwaysMemDF;
偵錯記憶體配置器會將防護位元組放在所有記憶體配置周圍。 不過,除非您檢查它們是否已變更,否則這些防護位元組不會有任何好處(這表示記憶體覆寫)。 否則,這只會提供一個緩衝區,事實上,可讓您擺脫記憶體覆寫。
開啟 checkAlwaysMemDF
,您將會強制 MFC AfxCheckMemory
在每次呼叫 new
或 delete
時呼叫函式。 如果偵測到記憶體覆寫,它會產生類似下列的 TRACE 訊息:
Damage Occurred! Block=0x5533
如果您看到其中一則訊息,您必須逐步執行程式碼,以判斷損毀發生的位置。 若要更精確地隔離發生記憶體覆寫的位置,您可以自行進行明確的呼叫 AfxCheckMemory
。 例如:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
如果第一個 ASSERT 成功,而第二個 ASSERT 失敗,表示兩個呼叫之間的函式中必須發生記憶體覆寫。
視應用程式的性質而定,您可能會發現導致 afxMemDF
程式執行速度太慢,甚至無法進行測試。 變數 afxMemDF
會針對每次呼叫 new 和 delete 呼叫時 AfxCheckMemory
呼叫。 在此情況下,您應該散佈對 () 的呼叫 AfxCheckMemory
,如上所示,並嘗試以這種方式隔離記憶體覆寫。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應