一个普通的MFC程序Release下没有任何问题。其实可能还存在潜在的其他问题。今天为了调试内存泄漏的问题。把程序编译成Debug版然后开始调试就报断言失败。

这次的报错的地方在MFC的源文件wincore.cpp的320行。

BOOL CWnd::Attach(HWND hWndNew)
{
    ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    ASSERT(FromHandlePermanent(hWndNew) == NULL);
        // must not already be in permanent map

    if (hWndNew == NULL)
        return FALSE;

    CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
    ASSERT(pMap != NULL);

    pMap->SetPermanent(m_hWnd = hWndNew, this);

#ifndef _AFX_NO_OCC_SUPPORT
    AttachControlSite(pMap);
#endif

    return TRUE;
}

320行在:

ASSERT(m_hWnd == NULL);

一个普通的对话框程序要动态创建三个对话框。单步调试到第一个没问题。第二个走到 CXXDlg->Create(....)的时候就报Asserting Failed。

这次应该想到第二个对话框的一些特殊的代码。没错。我子类化了一个CEdit。

我写了一个CExtEdit类。并且用ClassWizard绑定了一个变量CExtEdit m_ctlExtEdit。完了还在CXXDlg::OnInitDialog()里面加入了m_ctlExtEdit.SubClassDlgItem(...)。这样就造成了m_ctlExtEdit的重复子类化。

解决的方法有两个:

  1. 用ClassWizard去掉变量绑定m_ctlExtEdit,动态的创建一个CExtEdit。
  2. 去掉多余的.SubClassDlgItem函数。