類似的還有:AppMsg - Warning: Destroying non-NULL m_pMainWnd(這是因為你既沒有自己delete,也沒有調用DestroyWindow)
首先解決第一個,直接列代碼:
1 class SCCApp : public CWinApp 2 3 class CMainWindow : public CFrameWnd 4 5 BOOL SCCApp::InitInstance() 6 { 7 m_pMainWnd = new CMainWindow; 8 if (!::RegisterHotKey(m_pMainWnd->GetSafeHwnd(), 0x0001, NULL, VK_F1)) 9 { 10 ::MessageBox(NULL, _T("注冊F1熱鍵失敗!請關閉熱鍵沖突的程序並重啟本程序!"), 11 _T("錯誤"), MB_ICONERROR); 12 delete m_pMainWnd; 13 return FALSE; 14 } 15 m_pMainWnd->ShowWindow(m_nCmdShow); 16 m_pMainWnd->UpdateWindow(); 17 return TRUE; 18 }
12行,你直接delete,但該window不會收到WM_DESTROY and WM_NCDESTROY消息,所以無法正確的銷毀,替換為:
m_pMainWnd->DestroyWindow();
不需要你手動寫delete,這是因為雖然CWnd的PostNcDestroy不會調用delete this,但CFrameWnd的PostNcDestroy會調用delete this。你調用完之后m_pMainWnd會變為NULL,你可以在下面加如下代碼驗證:
if (m_pMainWnd == NULL) std::ofstream os("NULL");
最開始我在m_pMainWnd->DestroyWindow()后面用delete m_pMainWnd來驗證發現沒有報錯,就是因為delete NULL沒有任何效果。