//programming windows with MFC, second edition 里面有很多例子是用MFC 1.0的形式写的。如下面的BOOL CMyApp::InitInstance ()
{
//
// Verify that the host system is running in a palettized video mode.
//
    CClientDC dc (NULL);
    if ((dc.GetDeviceCaps (RASTERCAPS) & RC_PALETTE) == 0) {
        AfxMessageBox (_T ("Palette animation is not supported on this " \
    "device. Set the color depth to 256 colors and try again."),
            MB_ICONSTOP | MB_OK);
        return FALSE;
    } //
// Initialize the application as normal.
//
    m_pMainWnd = new CMainWindow;        //这里有new,但我发现不了有相关的delete,是不是有memory leak????
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}
//我认为是有memory leak的,但是那本书,全部都是这样的,没有delete,难道是有错?
//谢谢!!!

解决方案 »

  1.   

    放心,因为这个是必须常驻内存,一直被使用的。如果Delete的话,那么整个窗口也就不存在了。当程序退出之后,系统会为你自动释放掉的
      

  2.   

    memory leak主要是因为不再被使用的资源常驻内存
      

  3.   


    如果APP退出后,就应该释放啊。但自动释放是怎样呢? 为什么不在APP的析构函数里面delete???
      

  4.   

    楼主,你的想法是对的,确实应该delete。但是不能
        m_pMainWnd = new CMainWindow;
        m_pMainWnd->ShowWindow (m_nCmdShow);
        m_pMainWnd->UpdateWindow ();在之后delete。他可能是在CMainWindow 的其他地方 delete this了。
      

  5.   

    msdn上的类似的例子也是没有直接的delete语句的
      

  6.   

    m_pMainWnd并不是局部变量,所以可以在别的函数delete的
      

  7.   


    那为什么代码里面没有delete?
      

  8.   

    我觉得应该在以后delete,就是框架要关闭的时候吧~~
      

  9.   

    我觉得应该在以后delete,就是框架要关闭的时候吧~~
      

  10.   

    晕~
    主窗口你delete了,基本程序就退出了,操作系统会打扫战场的:)
      

  11.   

    那你在析构函数里写个MessageBeep(0)看看会不会运行?呵呵
      

  12.   

    在这里删的
    void CFrameWnd::PostNcDestroy()
    {
    // default for frame windows is to allocate them on the heap
    //  the default post-cleanup is to 'delete this'.
    // never explicitly call 'delete' on a CFrameWnd, use DestroyWindow instead
    delete this;
    }
      

  13.   

    由系统接管控制的,不过你可以加个ExitInstance()
      

  14.   

    要彻底搞明白还需要了解 MFC 运行机制 
      

  15.   

    对头:
    MFC里面很多框架类都是auto_delete的。
    一般都是在类本身的某个消息响应函数里面delete。把析构过程封装成消息驱动,从而达到更灵活更独立的效果。
      

  16.   

    你还可以看看不少类有auto_delete属性。把该属性置为false,你就必须显示释放。
    当这些类的对象在栈上构建的时候,你就必须把该属性关闭,否则出问题!
    如果没有该属性,纳米往往这些对象只能new出来用。上述Frame类应该就是这种。
      

  17.   

    new 操作使用的是堆分配内存,程序退出它的堆也自然释放。一个程序只有一个主窗口,当主窗口关闭时,程序也就退出了。所以不会有内存泄漏。
      

  18.   

    MFC很多窗口对象都是这样的,在响应WM_NCDESTROY的时候来个delete this,因为这是窗口的最后一个消息,可以释放对象了。
      

  19.   

    我觉得大家有点误解楼主的意思了。楼主贴上来的代码只是举个例子,不料这个例子太特殊了,他本意想问的可能是:非模态窗口显示的代码为什么只看到new,没看到他delete,这样是不是会造成内存泄漏? CModalessDlg pModalessDlg = new CModalessDlg();
    pModalessDlg->Create(IDD_MODALESS,this);
    pModalessDlg->ShowWindow(SW_SHOW);
      

  20.   

    会产生内存泄漏。
    m_pMainWnd是在基类CWinThread申明的,在CWinThread的析构函数中并没有调用delete m_pMainWnd;建议你把代码改为
        CMainWindow mainWnd
        m_pMainWnd = &mainWnd;
      

  21.   

    会不会内存泄漏就是看处理WM_NCDESTROY消息时有没有delete this,如果有,不会,没有,就有泄漏.
      

  22.   

    因为窗口类比较特殊,他有事件可以知道需不需要销毁对象.如果new了这个对象但是不创建窗口,不delete就会有内存泄漏.
      

  23.   

    FrameWnd默认状态下都会在 OnNCDestroy 中调用delete,因此不需要你释放。
      

  24.   

    一般书上的都是部分代码 作为示例解说
    具体还要看看随书附赠的源代码,要看整个工程正常下
    有new就肯定有delete
      

  25.   

    系统在销毁窗口的时候自动delete了,如果你加个delete也没有错,不加也不会泄露的,我以前跟你有一样的问题,我问过老师了。
      

  26.   

    在winfrm.cpp里面有自销毁代码:
    void CFrameWnd::PostNcDestroy()
    {
    // default for frame windows is to allocate them on the heap
    //  the default post-cleanup is to 'delete this'.
    // never explicitly call 'delete' on a CFrameWnd, use DestroyWindow instead
    delete this;
    }
      

  27.   

    其实大家都说得很清楚了,我也明白了。 谢谢Qt里面也有一个相似的,也没有delete,不知是不是也是这样呢?
      

  28.   

    ,最近正看《windows programing with MFC》,从上到下一路看下来,又学到了点东西,bangding
      

  29.   


    我看的与你的有点不同,我的是:  programming windows with MFC