要做一个仓库管理软件,我用了SDI,不带文档视图支持。主窗口菜单触发非模态对话框的创建和显示,我要求显示的对话框不能超出客户区里的视图范围。程序代码如下:
//这是非模态对话框CCgrkDlg的代码
void CCgrkDlg::OnCancel() 
{
CDialog::DestroyWindow();
}void CCgrkDlg::OnOk() 
{
CDialog::DestroyWindow();
}void CCgrkDlg::PostNcDestroy() 
{
CDialog::PostNcDestroy();
delete this;
}//这是SDI主窗口响应菜单的代码
void CMainFrame::OnCgrk() 
{
CCgrkDlg * pDlg = new CCgrkDlg();
pDlg->Create(IDD_CGRK);
         //此处设置m_wndView为父窗口是为了让非模对话框保持在客户区的视图内
pDlg->SetParent((CWnd*)&m_wndView);
pDlg->ShowWindow(SW_SHOW);
}
好了,代码就是这么简单,程序编译运行都没出错,也没显示内存泄露,现在的问题是:程序运行后,显示非模对话框,再关闭非模对话框,再关闭主窗口,程序正常退出,没有问题。在debug模式下,如果程序运行后,显示非模对话框,不关闭非模对话框,直接关闭主窗口,此时能听到电脑喇叭发出咚的一声。 在release下没有这个声音,也运行正常.我想是不是没有释放new出来的对话框对象呢,设置断点,发现关闭主窗口时代码分别进入了
void CCgrkDlg::PostNcDestroy() 这个函数,继续执行,提示了Debug Assertion Failed!的错误对话框。难道我的做法有问题,baidu了关于这方面的问题,发现居然没人遇见,难道是我的做法有问题?急求高手解答,拜谢!!!

解决方案 »

  1.   

    VS2008 测试LZ的代码无此问题
      

  2.   

    VS2005 测试也未发现问题。。m_wndView指的是GetActiveView()吗?
      

  3.   

    唉,我还很落后vc6在用,.net的不会回2楼,m_wndView不是GetActiveView()获得的。
    如果是带文档视图支持的,这里就要设置GetActiveView()为父窗口
    我这没带文档视图支持,这个view也是框架自动生成的对象,是CMainFrame的成员
    实在不行,我只能用笨拙的解决方法了:
    在主窗口里保存所有new出来的对话框链表,对话框关闭时给父窗口发消息,通知它delete对象
    应用关闭时,遍历这个链表,一个一个关闭和delete
      

  4.   

    楼主是有无效指针什么的吧,,debug 下断言 失败弹出对话框发出的声响吧,由于程序马上退出了 所以楼主没看到对话框吧,调试一下看看。
      

  5.   

    都没问题? 
    难道我系统有问题?vc有问题?刚我又建了个工程,单独测试模态对话框,debug测试下来有内存泄露!
      

  6.   

    在主窗口的WMCLOSE里面把那个pDlg->DestoryWindow();