封闭非模式对话框引发的内存泄露

关闭非模式对话框引发的内存泄露
    新建一个对话框工程,拖两个按钮。添加一个对话框资源(IDD_DIALOG1),里面复制很多控件(至少几十个),关联类CDlg。
主对话框按钮1:

#include "Dlg.h"
CDlg* p;
void CdddDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int n = sizeof(CDlg);
p = new CDlg;
p->Create( IDD_DIALOG1, this );
p->ShowWindow(SW_NORMAL);
}


主对话框按钮2:

p->OnCancel();


CDlg类重载OnCancel,添加OnNcDestroy

void CDlg::OnNcDestroy()
{
CDialogEx::OnNcDestroy();

// TODO: 在此处添加消息处理程序代码
delete this;
}


void CDlg::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类

//CDialogEx::OnCancel();

DestroyWindow();
}



在主窗口点击button1,button2如此反复,内存不断增长
怀疑是非模态对话框的控件资源没有销毁,求真理!
关闭非模式对话框引发的内存泄露

------解决方案--------------------
我做的测试:
使用CAboutDlg,其上有36个控件
CAboutDlg* dlg = NULL;
void CNoneDlg::OnBnClickedOk()
{
ASSERT(dlg == NULL);
dlg = new CAboutDlg;
dlg->Create(CAboutDlg::IDD, this);
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
}
void CNoneDlg::OnBnClickedCancel()
{
ASSERT(dlg != NULL);
dlg->DestroyWindow();
delete dlg;
dlg = NULL;
}
查看任务管理器,内存确实在不断增长,而且关闭删除后没有下降。增长幅度不是很大,大约10K到50K,创建关闭数次,从3158K增长到3288K。进程退出后,vs输出窗口未看到内存泄露。
这完全在可接受范围。
------解决方案--------------------
DEBUG_NEW这个确实是对内存申请报告是否泄漏.
因为你的CDlg中可能会有new,或者你的控件类中可能会有new.

还有, 你可以在任务管理器中, 可以选择列, 看 句柄数 是否在持续增加.