vc/mfc项目对话框A中一Button控件,点击它弹出一无模对话框B.我是这样销毁B的
void B::OnBnClickedCancel()//重载OnCancel()
{
     OnCancel();
     this->DestroyWindow();
}void B::OnDestroy()//重载WM_DESTORY消息
{
     CDialog::OnDestroy();
     delete this;
}
这样会不会造成内存泄漏?这样的代码是不是安全的?请高手指点,谢谢!学习,关注……

解决方案 »

  1.   

    1、有了OnCancel()就不需要OnDestroy()了,系统会自动调用销毁函数;
    2、delete this是多余的,系统也会自己做的所以这两个函数如果只有这些代码的话,都是多余的
      

  2.   

    不是的吧
    delete this怎么是多余的啊?如没有这个new出来的无模对话框B,它的空间就没办法释放了不是吗 ?
      

  3.   

    如果你的B是new出来的,那就应该在DoModal()以后delete:
    CBDlg *pDlg = new CBDlg;
    pDlg->DoModal();
    delete pDlg;别在该类自身中delete,自己删除自己,呵呵,是人也不爽啊
      

  4.   

    delete this至少不会编译出错,呵呵
    运行似乎也可以,不过不直观,还是楼上说的好
      

  5.   

    B是无模显示的啊
    也就是说用 Creat 不是 DoModal我这个方法是在vc知识库看到的
    上面提到2中方法,一中就是上述那种了,还有一种就是发消息给父对话框,让父对话框来delete
      

  6.   

    无模式对话框就应该delete this。
    不过最好在PostNcDestroy()中,发生在WM_NCDESTROY之后。
      

  7.   

    你把你创建的代码也贴出来看看啊,是怎么分配内存的?
    一般如果delete this都放在OnNcDestory里面做。
      

  8.   

    一般没有在类中自己删除自己"delete this"这样的用法吧?
      

  9.   

    CXXXDlg* pDlg = new CXXXDlg(this);
      pDlg->Create(nID,NULL);
      pDlg->ShowWindow(SW_SHOW);
    然后在
    void CXXXDlg::OnBnClickedCancel()//重载OnCancel()
    {
         OnCancel();
         this->DestroyWindow();
    }void CXXXDlg::OnDestroy()//重载WM_DESTORY消息
    {
         CDialog::OnDestroy();
         delete this;
    }
      

  10.   

    就象楼上所说的,我就是
    CXXXDlg* pDlg = new CXXXDlg(this);
      pDlg->Create(nID,NULL);
      pDlg->ShowWindow(SW_SHOW);
    创建无模对话框的那么如果点击对话框右上角的"X"会不会调用OnCancel()函数?
      

  11.   

    ctrl+w class wizard里面选中这个函数就行了。
    怎么一点都不愿意自己试试呢!
      

  12.   

    绝对安全的就是放在PostNcDestroy()里 delete this
    当时第一次使用无模时找了很多资料,每个资料都是这样的
      

  13.   

    TO:ilovevc(ilovevc) 
    class wizard没有啊!
      

  14.   

    vc.net?
    那个好像在class view -》 properties -》 override 里面。垃圾得很,什么都得动鼠标。
      

  15.   

    呵呵
    你是说vc.net和垃圾吗?那什么比较好啊?C#?
      

  16.   

    vc.net很垃圾吗?那什么比较好啊?C#?学习……
      

  17.   

    我是说vc.net的IDE很垃圾,搞的跟office似的,花里胡哨的。上手容易,想快也难。
    很多地方都没有快捷键了。mfc也是人老珠黄了,用它还可以,学它就不必了吧。C#也是,要用才学,要学就学纯的C++吧。
      

  18.   

    CXXXDlg* pDlg = new CXXXDlg(this);
    pDlg->Create(nID,NULL);
    pDlg->ShowWindow(SW_SHOW);用 ClassWizard 找到 PostNcDestroy 消息生成如下函数
    void CXXXDlg::PostNcDestroy() 
    {
    // TODO: Add your specialized code here and/or call the base class
             
             delete this; //加入这句释放

    CDialog::PostNcDestroy();
    }
      

  19.   

    楼上的大哥的意思就是:类似重载OnInitDialog那样重载PostNcDestroy()不知道这样理解是不是正确?学习……