解决:AppMsg - Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called

类似的还有: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没有任何效果。

posted @ 2015-08-17 22:49  rldts  阅读(3031)  评论(0编辑  收藏  举报