一般c++ 是谁new ,谁delete 。当然有特殊的,比如:mfc中。 销毁非模式对话框 ,就是特使的,  微软说的标准的做法是在void CADialog::PostNcDestroy() 
{
// TODO: Add your specialized code here and/or call the base class

CDialog::PostNcDestroy();      delete this;    //多加的一句,调用析构
}很明显 微软不遵循c++ 语法标准。我为了让谁new , 谁delete  ,  
 大家帮忙看看,我的以下 做法有没有什么缺陷,  有的话,帮忙纠正一下,谢谢了啊。下面是 代码.................................对话框上 已经去掉 确定 和取消 两个按钮了。void CADialog::OnClose() 
{
// TODO: Add your message handler code here and/or call default

//CDialog::OnClose();
DestroyWindow();

}void CADialog::PostNcDestroy() 
{
// TODO: Add your specialized code here and/or call the base class

CDialog::PostNcDestroy(); ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DIALOG_DESTROY,CADialog::IDD,0);    //发送销毁对话框的消息给付窗口
}
而在 主框架中:
////////////////////////////////////////
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
pdlg=NULL;

}
void CMainFrame::OnTest() 
{
// TODO: Add your command handler code here if(pdlg==NULL)   //没创建,则创建之
{
pdlg=new CADialog(this);
pdlg->Create(IDD_DIALOG1,this);
}
pdlg->ShowWindow(SW_SHOW);

}
//处理对话框等窗口发给主框架的自定义消息
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{ if( wParam==CADialog::IDD && lParam==0)
{
delete pdlg;  //销毁对话框
pdlg=NULL;
} return 0;
}
这样 就实现了 ,点击右上角,对话框释放掉,然后点击菜单再次创建的功能了。。程序运行后,没任何问题, 不知道有没有潜在的问题,有的话,请指出。
第二个问题:网上侯捷的部分章节提到:在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环 可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。 
也就是说,侯捷指出,对于窗口来讲,没有所谓的PostNcDestroy啊???  这是为什么???
谢谢大家了。。 帮忙解答一下 

解决方案 »

  1.   

    如果类中重载了new和delete运算符,调用的时候是调用类中重载的,如果没没重载调用系统提供的
      

  2.   

    MFC把很多东西都封装了  
      

  3.   

    PostNcDestroy是由OnNcDestroy调用的
    OnNcDestroy是由非客户区销毁触发的
      

  4.   

    PostNcDestroy()
    Called by the default OnNcDestroy member function after the window has been destroyed. 
      

  5.   

    void CADialog::PostNcDestroy()  
    {
    // TODO: Add your specialized code here and/or call the base classCDialog::PostNcDestroy();::SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DIALOG_DESTROY,CADialog::IDD,0); //发送销毁对话框的消息给付窗口
    }
    我在这里 发送自定义的消息给主框架,让主框架去销毁它new出来的对话框, 就没事了吧
    我看了不少文章,  该死的mfc封装太厉害了。。好些文章都说PostNCDestroy 是销毁对话框的最后一个函数。。

    所以在这里来 发送 同步消息 给主框架销毁, 就不会不会造成什么  资源没有释放了
      

  6.   

    谁new,谁delete,并不是绝对的,窗口new和显示是主动的,关闭和delete却是被动的,所以delete与new就不在一起了。
      

  7.   

    感觉mfc 这套 不符合c++ 标准不好不好DestroyWindow-------OnDestroy-------OnNCDestroy最后一个消息响应函数了-----PostNCDestroy 函数OnNCDestroy最后一个消息响应函数了它又调用CWnd::PostNCDestroy  ok ,我懂了, 我的法子是对的,哈哈 多谢个给位, 可以结贴了。 楼上的给位兄弟辛苦了OnNCDestroy()函数是当窗口销毁的时候调用的最后一个函数,同样WM_NCDESTROY是发送给窗口的最后一个消息。(WM_NCDESTROY is the absolute LAST message sent.)在CWnd::OnNCDestroy()函数的最后会调用一个虚函数PostNcDestroy(),我想这个虚函数的最大用处就是留了一个删除自己的接口。例如CView::PostNcDestroy(),CFrameWnd::PostNcDestroy()都是做了删除自己的工作delete this.同样对于一个非模态对话框,如果我们为对象在堆上分配内存,就可以在函数PostNcDestroy()中删除自己。
      

  8.   

    不一定是谁new就谁delete,调用约定里有规定是谁delete,标准应该只是建议
      

  9.   

    MFC是微软自己的库,他可以按照标准做,也可以不按照标准。至于最终是怎么做的还要看微软自己的方式,你要用MFC就需要遵循它的标准和定义。希望能够帮到你!
      

  10.   


    谁New谁就Delete,这只是建议的做法,不过一般都会遵循这样的方法.
      

  11.   

    谁new,谁delete只是一个建议。
    像strdup这个c函数,也是只malloc了,没free,要自己free。这个函数的作用就是复制一个字符串。
    char *strdup(
       const char *strSource 
    );
      

  12.   

    linux man手册里的说明
           #include <string.h>       char *strdup(const char *s);       #define _GNU_SOURCE
           #include <string.h>       char *strndup(const char *s, size_t n);
           char *strdupa(const char *s);
           char *strndupa(const char *s, size_t n);DESCRIPTION
           The  strdup()  function  returns a pointer to a new string which is a
           duplicate of the string s.  Memory for the  new  string  is  obtained
           with malloc(3), and can be freed with free(3).
      

  13.   

    PostNcDestroy是由OnNcDestroy调用的
    OnNcDestroy是由非客户区销毁触发的