无模式对话框内存泄漏

lqm1003 2006-03-24 10:50:12
我创建了如下对话框(用的是VS2005)
CLookupDlg *cDlg=new CLookupDlg;
cDlg->Create(IDD_LOOKUP_DIALOG,NULL);
cDlg->ShowWindow(SW_SHOW);
并通过以下方式销毁
void CLookupDlg::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}

void CLookupDlg::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CLookupDlg::OnDestroy()
{
CDialog::OnDestroy();
delete this;
}
但是关闭对话框后内存却没释放
另外我的OnPaint函数如下,不知是否与此有关:
void CLookupDlg::OnPaint()
{
HRGN hRgn = NULL;
::GetWindowRgn(m_hWnd,hRgn);
DeleteObject(hRgn);
CRect rc;
this->GetClientRect(&rc);
hRgn=CreateRoundRectRgn(5,5,rc.right-rc.left-10,rc.bottom-rc.top-10,16,16);
::SetWindowRgn(m_hWnd,hRgn,TRUE);
CPaintDC pdc(this);
CBitmap bitmap1,*pbitmap1;
bitmap1.LoadBitmap(IDB_BACKGD2_BITMAP);
CDC dc1;
dc1.CreateCompatibleDC(&pdc);
pbitmap1=dc1.SelectObject(&bitmap1);
CRect rect;
GetClientRect(&rect);
pdc.BitBlt(rect.left-2,rect.top-2,rect.right-rect.left+10,rect.bottom-rect.top+10,&dc1,0,0,SRCCOPY);
dc1.SelectObject(pbitmap1);
bitmap1.DeleteObject();
DeleteObject(hRgn);
this->ReleaseDC(&dc1);
//CDialog::OnPaint();
}
请各位大虾帮忙
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2006-03-25
  • 打赏
  • 举报
回复
http://blog.csdn.net/DentistryDoctor/archive/2006/02/15/599881.aspx
DentistryDoctor 2006-03-25
  • 打赏
  • 举报
回复
可能是其它地方造成的。
Snow_Ice11111 2006-03-25
  • 打赏
  • 举报
回复
学习一下
lixiaosan 2006-03-24
  • 打赏
  • 举报
回复
你要考虑到两个方面
1.用户先关闭无模式对话框后,再关闭主对话框
2.用户直接关闭主对话框

对于1,
方法一:在无模式对话框关闭后,除了销毁窗口,你还需要发消息通知父窗口把创建时候的指针置NULL,否则下次再打开无模式会出错
方法二:重载弹出的无模式对话框的oncancel,注释其CDialog::OnCancel(),在其中实现隐藏无模式对话框。在父对话框的create前检查cDlg是否存在,存在则显示之,不存在则create。

对于2,需要在父对话框的析构函数中,销毁无模式对话框。
Kudeet 2006-03-24
  • 打赏
  • 举报
回复
定义一个自定义消息,在对话框函数
void CLookupDlg::OnCancel()
{
//发送自定义消息到父窗口
}
void CParentDlg::Custom()
{
cDlg->DestroyWindow();
delete cDlg;
}
huangwc 2006-03-24
  • 打赏
  • 举报
回复
如果里面有绘图的操作
那你最好是检查有没有资源没有释放
比如CreateDc之后要DeleteDc
CreateCompatibleBitmap之后要Delete
等等
这个你可以在资源管理器里面看看GDI对象有没有没释放的。
我刚刚就调过这样的问题。
lqm1003 2006-03-24
  • 打赏
  • 举报
回复
谢谢几位了,你们的方法我都试了一下,但还是不行,不知道是不是其他原因引起的。对话框里的东西不多,主要耗内存的地方就在OnPaint执行的操作,精确点应该是装入的底图占的内存最多,不知道为什么关闭了对话框这些内存没释放(我是在任务管理器看的)。
唉,搞了一天都没搞出来,郁闷死我了。请各位帮帮忙。
goodboyws 2006-03-24
  • 打赏
  • 举报
回复
CLookupDlg::PostNcDestroy()
{
delete this;
}

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧