1、非模态对话框是在堆中产生,必须要释放;模态对话框在栈中,过了作用域会自动释放

2、此时用IDOK,IDCANCEL关闭窗体时,应对OnOK,OnCancel重写,CDialog::OnOK();CDialog::OnCancel();应被替换为CDialog::DestroyWindow()。因为前者是会条用CDialog::EndDialog, 其是为模态对话框而设计,非模态调用它只能隐藏窗体而不会释放。

     void CTestDlg::OnOK()
    {
     / / TODO: Add extra validation here 
     CDialog::DestroyWindow();             // Here!
    }

3、如果对话框为游离状态(指父窗体或其他窗体没有掌控指向该对话框的指针),就需要重载PostNcDestroy

     void CTestDlg::PostNcDestroy()
     {
          CDialog::PostNcDestroy();            //据说此函数在基类什么都没做
          delete this;                                        //在此释放窗体内存块                                          
      }

    当然父窗体有该模态对话框的指针CDlg*  pDlg,在适当的时候delete pDlg即可

4、上面的E为提到:OnClose 默认会调用 DestroyWindow,追踪了一下,没调呀!通过右上角的X按钮关闭对话框时不就内存泄露了。只好自己调了。

    void CTestDlg::OnClose()
    {    CDialog::OnClose();
         DestroyWindow();
    }

总之:先DestroyWindow, 然后delete

<后面引用.....>
用PostNCDestory将windows内核对象销毁,调用delete把对话框的c++对象销毁。       
第一步后,该对象的m_hWnd句柄成员应该置为0.      
对于一个mfc的对话框对象,它实际上分为两部分,一部分是系统内核对象,用句柄标识,一部分是用于包装这个句柄的c++对