2008-12-04 152 views
0

如何正確銷燬指向CFindReplaceDialog對象的指針?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」操作符創建。然後創建成員函數應該被調用。 我的「查找」功能對關閉此查找對話框起反應。它調用DestroyWindow()函數,嘗試刪除對話框對象。

但是,當我嘗試在OnFind()或析構函數中調用DestoyWindow()時,我有一個異常「地址訪問衝突...」。

如何銷燬這個對話框並刪除指針?

回答

1

如果有人對我這個問題感興趣,那麼解決方案很簡單。 實際上,在使用它之後,您不必刪除CFindReplaceDislog *指針。

關閉後,它收到WM_NCDESTROY消息。並且就CWnd派生而言,調用CWnd :: OnNcDestroy()處理函數。在最後一行中,它調用PostNcDestroy(),它在CWnd中什麼都不做,但在CFindReplaceDialog中被覆蓋。在那裏,它會刪除this指針像這樣:

void CFindReplaceDialog::PostNcDestroy() 
{ 
    ASSERT(m_hWnd == NULL); 
    delete this; 
} 

所以,你不必調用

delete(m_pFRDlg) 

隨時隨地