none
詢問Delete pointer的問題 RRS feed

  • 問題

  • Dear all

    小弟遇到一個問題 不清楚為什麼 想請教大家回答

    我New了一個Dialog, 程式碼如下

    CDialog *dlgTaskReport;//<---In MainFrm.h

    void CMainFrame::OnToolTaskReport(){

    if (dlgTaskReport==NULL){
        dlgTaskReport = new CDlgTaskReport();
        dlgTaskReport->Create(IDD_TASK_REPORT);
    }}

    接著我刪除掉這個Dialog, 程式碼如下

    void CDlgTaskReport::PostNcDestroy(){
        ((CMainFrame*)AfxGetMainWnd())->dlgTaskReport = NULL;
        delete this;
        CDialog::PostNcDestroy();
    }

    我發現我再次呼叫CMainFrame::OnToolTaskReport時,dlgTaskReport==NULL判定為真

    可是我將刪除掉Dialog的程式碼改成如下,dlgTaskReport==NULL判定就為假了, 不知道為什麼, 請問大家原因是什麼

    CDlgTaskReport* GetDlgTaskReport(){ //In MainFrame.h
        return (CDlgTaskReport*)dlgTaskReport;
    }

    void CDlgTaskReport::PostNcDestroy(){

        CDlgTaskReport* tmpDlg =

            (CDlgTaskReport*)((CMainFrame*)AfxGetMainWnd())->GetDlgTaskReport() ;
        tmpDlg = NULL;
        delete this;
        CDialog::PostNcDestroy();
    }

    • 已編輯 陸雲 2011年2月24日 上午 06:28
    2011年2月23日 上午 08:57

所有回覆

  • 有Dialog類別之後, 只要利用類別建立物件, 呼叫物件的DoModal方法即可顯示Dialog, 不需要加入處理顯示和關閉的程式碼, 例如:

    CDlgTaskReport dlg;

    dlg.DoModal();

    2011年2月23日 下午 03:12
  • Hi~tihs

    謝謝您的回覆(我發現我文章有點錯 剛改正)

    我這是Modless Dialog, 所以才這樣寫的

    其實我只是想知道直接delete new 出來的成員變數並設成NULL

    ((CMainFrame*)AfxGetMainWnd())->dlgTaskReport = NULL;

    跟呼叫function得到成員變數再delete, 為什麼結果會不一樣 搞不懂

    CDlgTaskReport* tmpDlg =  (CDlgTaskReport*)((CMainFrame*)

    AfxGetMainWnd())->GetDlgTaskReport() ;
    tmpDlg = NULL;

    2011年2月24日 上午 06:30
  • Modeless Dialog的話可以呼叫DestroyWindow將其關閉, 例如:

    dlgTaskReport->DestroyWindow();

    2011年2月24日 下午 03:11