既然我们已分配内存就堆,我们必须将它删除时,非模式对话框是摧毁,否则我们很快会遇到很大的麻烦与内存泄漏,左,右和中心。当对话框是摧毁了最后一则留言,我们收到处理类是WM_NCDESTROY消息。该OnNcDestroy功能函数是引用,这在原来调用虚拟函数PostNcDestroy 。这正是我们可以delete我们的非模式对话框。 First Call调查的基类的功能函数,以便它是否自己的清理。步骤/方法
  void CModeLess::PostNcDestroy()
  {
  CDialog::PostNcDestroy();
  delete this;
  }

解决方案 »

  1.   

    我 草 我没出过国啊
    不是网上释放非模式对话框的方法吗 在销毁函数里delete this
    但是 不按照网上添加这个消息 我在关闭非模式对话框的时候,打断点也能进入非模式的对话框的析构函数里啊
    那在destory消息delete this 有何意义呢????????????
      

  2.   

    在此处delete this的前提是,你的modaless窗口必须是new出来的。
    等等,PostNcDestroy什么意思?不应该是OnNcDestroy吗
      

  3.   

    When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup. ---------------
    那是MS推荐的做法
      

  4.   


    不是网上释放非模式对话框的方法吗 在销毁函数里delete this
    但是 不按照网上添加这个消息 我在关闭非模式对话框的时候,打断点也能进入非模式的对话框的析构函数里啊
      

  5.   

    既然可以断下来,你看下调用堆栈是在哪里调用的delete.这个delete肯定不是MFC替你调用个的。
      

  6.   

    我是在这个非模式对话框的父窗口的析构函数delete的!
    在哪里delete都行吗?可以不再OnNcDestroy消息里delete吗
      

  7.   

    只要不是重复delete 在哪delete都行。OnNcDestroy 有两个好处1. 这个消息不会重复,不会遗漏。所以不会重复delete,也不会遗漏delete。
    2. 这个消息是窗口收到的最后一个消息,也就是收到这个消息后,这个窗口就没用了。
    这是最早的delete不会出错的地方。因此大多推荐在这个地方delete.你那种方式,代码只有那么几个类,因此是无所谓的。
    再加个类,引用了非模式窗口。
    那么你还要在这个类的析构函数里面再写一次delete。
    而在OnNcDestroy,就不需要再写。