如何正确销毁指向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()
时,我有一个例外:
地址访问违规行为......
如何销毁此对话框并删除指针?
答案 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}}。