CWND * wnd = new CWND();
像这类的指针需要在退出时delete掉吗?还是让MFC自己处理?

解决方案 »

  1.   

    there is no garbage collection mechanism in the MFC programming.you must free memory manually.
      

  2.   

    一定要,虽然不用delete不一定出错,编译也能通过,但是程序运行不释放内存空间是不行的.这也是程序优化必须考虑的一个因素
      

  3.   

    等不需要用到它的时候手动delete,一般都会报错吧
      

  4.   

    我在一个DLL中有一个CWnd和一个HWND变量:
    CWnd *wnd;
    HWND hWnd;在一个DLL接口函数中:
    wnd = new CWnd();
    wnd->CreatEx(...);
    hWnd = wnd->GetSafeWnd();我在一个DLL接口函数Close中写了如下删除的代码:
    if(theApp.hWnd)  //1
    {
    DestroyWindow(theApp.hWnd);
    theApp.hWnd = NULL;
    }

    if(theApp.wnd)  //2
    {
    delete theApp.wnd;
    theApp.wnd = NULL;
    }
    2处会发生错误.
    请问这段代码哪里有问题?
      

  5.   

    在c++中, 有new必有delete,否则泄露。
    .net除外。
      

  6.   

    2改成:
    if(theApp.wnd) //2
    {
    theApp.wnd->DestroyWindow();
    delete theApp.wnd;
    theApp.wnd = NULL;
    }
    结果一样.
    错误是Debug Assertion Failed,点重试则跳到wincore.cpp的如下语句:
    ENSURE(pMap != NULL);
      

  7.   

    在http://up-u.com/archives/106看到一篇文章,说重载这个虚函数 CWnd::PostNcDestroy() ,然后里头调用 delete this.
    为什么要用这个方法呢?
      

  8.   

    重载PostNcDestroy问题依旧, 但是重载OnNcDestroy后成功删除了CWnd*对象.
    这两个函数都没有自动调用, 我是手动呼加OnNcDestroy()来完成的.
    不知道这个方法对不对, 或者还有没有其它方法?
      

  9.   

    按楼上的方法改了编译运行都正常.
    但是不知道具体原因, 为什么这样可以? 还有这个跟delete this的方法有何不同? 望高手指点一二!
      

  10.   

    按liwz123的方法改了后还是遇到了问题, 我想这是因为这个删除操作并不能保证后面就不用这个cwnd了, 最后还是用OnNcDestroy这个方法.谢谢大家的参与.希望对这个有个更深入的讨论.