MFC CFindReplaceDialog破坏

时间:2008-12-04 15:32:20

标签: windows mfc

如何正确销毁指向CFindReplaceDialog对象的指针?

例如我有课程:

class CjumpView : public CRichEditView
{
   CFindReplceDialog *m_pFRDlg;
   // ...
}; 

CjumpView::CjumpView()
            : m_pFRDlg(NULL)
{

}

CjumpView::~CjumpView()
{
   if(m_pFRDlg != NULL)
   {
      m_pFRDlg->DestroyWindow();
      delete(m_pFRDlg);
   }
}

void CjumpView::OnEditFind()
{
    if(m_pFRDlg == NULL)
    {
        const bool fShowFind = true;
        m_pFRDlg = new CFindReplaceDialog();
        m_pFRDlg->Create(fShowFind, m_sFind, NULL, NULL, this)
    }

}


LRESULT CjumpView::OnFind(WPARAM, LPARAM lParam)
{
    LPFINDREPLACE lpFindReplace = reinterpret_cast<LPFINDREPLACE>(lParam);
    if(lpFindReplace->Flags & FR_DIALOGTERM)
    {
        m_pFRDlg->DestroyWindow();
            delete(m_pFRDlg);
            m_pFRDlg = NULL;
        return NULL;
    }
    lpFindReplace->Flags = 0;
    return NULL;
}

在Visual Studio CFindReplaceDialog帮助文章中,应该使用new运算符在堆中创建此类的对象。然后应该调用Create成员函数。

我的OnFind函数在关闭此查找对话框时作出反应。它调用DestroyWindow()函数,尝试删除对话框对象。

但是当我尝试在DestoyWindow()或析构函数中调用OnFind()时,我有一个例外:

  

地址访问违规行为......

如何销毁此对话框并删除指针?

1 个答案:

答案 0 :(得分:2)

如果有人对我这个问题感兴趣,解决方案很简单。 实际上,在使用它之后你不必删除CFindReplaceDislog*指针。

关闭后,会收到WM_NCDESTROY条消息。并且只要从CWnd派生,就会调用CWnd::OnNcDestroy()处理程序。在最后一行中,它调用PostNcDestroy() CWnd,但CFindReplaceDialog无效,但在void CFindReplaceDialog::PostNcDestroy() { ASSERT(m_hWnd == NULL); delete this; } 中覆盖。在那里它删除'this'指针如下:

delete(m_pFRDlg)

因此,您无需在任何地方调用{{1}}。