我知道DestroyWindow函数可以把窗口清除,然后自动调用WM_DESTROY消息,从而调用PostQuitMessage,送出MW_QUIT信息,这样的话就会结束信息循环,就会结束整个的应用程序。我的问题是:
前面已经用new来开辟了一个关于对话框的对象空间
CMyDlg *pDlg=new CMyDlg; 如果我已经用 DestroyWindow来消除了一个对话框,还有必要用delete函数来释放内存的空间么?
是不是结束了整个的应用程序,就会自动的释放已经申请的内存空间?清高手答复,谢谢

解决方案 »

  1.   

    if modeless dialog,should Override CWnd::PostNcDestroy() in your dialog class to delete the dialog box object
      

  2.   

    完全正确。只要应用程序退出,所有的空间都会被系统回收。包括程序中new的空间(哪怕已经泄漏的)。内存泄漏主要是相对程序运行过程中来说的。
      

  3.   

    DestroyWindow自动帮你搞定,释放内存空间
      

  4.   

    DestroyWindow不会回收空间。一个进程结束后内存空间由系统回收。虽pDlg会被回收,但建议new跟delete配对使用。
      

  5.   

    调用DestroyWindow后再将指针置为空
      

  6.   

    调用DestroyWindow只是销毁的创建的窗口,但窗口对象所占用的空间仍未释放,所以还需要delete
      

  7.   

    wwww2()  调用DestroyWindow只是销毁的创建的窗口,但窗口对象所占用的空间仍未释放,所以还需要delete
    同意该说法!!!
      

  8.   

    CMyDlg *pDlg=new CMyDlg; pDlg->DestroyWindow();之后一定要调用
    delete pDlg;不调用的话内存不会释放,而且析构函数只会在调用delete之后才会调用
      

  9.   

    如果你在dlg中有自己分配的空间,要自己注意回收,否则可能有问题
      

  10.   

    自己试试,不就行了.
    1,建立一个基干对话框的程序.
    2,在CAboutDlg内加一个变量char * p,在构造函数中new 10M,在析构函数中delete.
    3,在主对话框中加三个按钮.
      按钮一: new CAboutdlg.
      按钮二: DestroyWindow
      按钮三: delete
      

  11.   

    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    p = new char[10000000];
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
    }CAboutDlg::~CAboutDlg()
    {
    delete [] p;
    } CAboutDlg * pAboutDlg = NULL;
    void CDestroydlgDlg::OnButton1() 
    {
    if(NULL == pAboutDlg)
    pAboutDlg = new CAboutDlg;
    }void CDestroydlgDlg::OnButton2() 
    {
    if(NULL != pAboutDlg)
    {
    pAboutDlg->DestroyWindow();
    pAboutDlg = NULL ;
    }

    }void CDestroydlgDlg::OnButton3() 
    {
    if(NULL != pAboutDlg)
    {
    delete [] pAboutDlg;
    pAboutDlg = NULL ; 
    }

    }我的结果是必须delete
      

  12.   

    //验证必须delete,点击此按钮看内存占用增加了没有
    void CDestroydlgDlg::OnButton4() 
    {
    for(int i = 0 ; i < 100000 ; i++)
    {
    CDialog * pDlg  = new CDialog(IDD_ABOUTBOX);
    pDlg->DestroyWindow();
    //delete pDlg;
    }
    }
    //更简单的方法
    //f5进入调试状态,在程序结束时vc会报内存泄露的
    //显示在output
      

  13.   

    做一个例子吧
    class CTestDialog : public CDialog
    {
    public:
    ~CTestDialog()
    {
    MessageBox( "~CTestDialog()" );
    }
    ...
    }
    创建对话框
    CTestDialog *pDlg = new CTestDialog();
    pDlg->Create( IDD_DIALOG1, this );
    销毁对话框
    pDlg->DestroyWindow();
    看见了吗?会弹出一个对话框,就是析构函数里的那个对话框
    这就证明了调用DestroyWindow时会析构该对象。那么在这之后pDlg不就是空的了吗?
    但是如果再delete pDlg并不会出错,那不是说pDlg还是指向某一片内存的吗?
    我也糊涂了,请大家说说吧,我的结论就是还要delete的
      

  14.   

    pDlg->DestroyWindow();没有弹出消息框,但
    delete pDlg时弹出消息框了,
    所以说delete是必须的
      

  15.   

    就是啊,经过试验,UPCCPU(CPU) 说的不是事实。是不是你的眼镜需要重新配了?另外,在C/C++里,还需要讨论new完之后是否需要delete这种问题?我的天……
      

  16.   

    再说,实在不清楚,可以察看MFC源代码啊:BOOL CWnd::DestroyWindow()
    {
    if (m_hWnd == NULL)
    return FALSE; CHandleMap* pMap = afxMapHWND();
    ASSERT(pMap != NULL);
    CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
    #ifdef _DEBUG
    HWND hWndOrig = m_hWnd;
    #endif#ifdef _AFX_NO_OCC_SUPPORT
    BOOL bResult = ::DestroyWindow(m_hWnd);
    #else //_AFX_NO_OCC_SUPPORT
    BOOL bResult;
    if (m_pCtrlSite == NULL)
    bResult = ::DestroyWindow(m_hWnd);
    else
    bResult = m_pCtrlSite->DestroyControl();
    #endif //_AFX_NO_OCC_SUPPORT // Note that 'this' may have been deleted at this point,
    //  (but only if pWnd != NULL)
    if (pWnd != NULL)
    {
    // Should have been detached by OnNcDestroy
    #ifdef _DEBUG
    ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);
    #endif
    }
    else
    {
    #ifdef _DEBUG
    ASSERT(m_hWnd == hWndOrig);
    #endif
    // Detach after DestroyWindow called just in case
    Detach();
    }
    return bResult;
    }看看这个DestroyWindow里哪句话会delete this ?
      

  17.   

    肯定是要调用delete的, 只是, 很多类会在CWnd::PostNcDestroy(),中delete this的,而destroywindow函数会导致CWnd::PostNcDestroy()函数的调用. 所以你们编程时, 看上去就不需要自己去delete, 不过, 对于CDialog , CToolBar,等很多, 都需要显示的调用delete, 因为他们的 PostNcDestroy()函数中, 并没有delete this
    记住一点, 如果他是 new 出来的, 那么肯定有一个地方 delete 它, 否则都会有内存泄漏.
      

  18.   

    可是仅仅DestroyWindow会有内存泄漏,如果一次也就算了
    如果一个窗口反复开几百次不就死定了