对话框打开关闭存在内存泄露,求助!

makaayxjtu 2014-02-11 09:03:28
1.VC6.0 新建ATL COM,增加接口,用于弹出模态(非模态)对话框。
2.VC6.0 新建多文档视图,菜单响应,调用1中提供的接口。

测试发现:对话框打开关闭存在内存泄露。

非模态对话框打开代码如下:
1)COM中打开非模态对话框接口
STDMETHODIMP CIn::opendlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CDlg *pDlg = new CDlg;
pDlg->Create(IDD_DIALOG1,NULL);
pDlg->ShowWindow(SW_SHOW);

return S_OK;
}



2)COM中对话框是向导生成的,为支持非模态对话框,增加如下函数:
void CDlg::OnClose()
{
CDialog::OnClose();
DestroyWindow();
}
void CDlg::PostNcDestroy()
{
delete this;
CDialog::PostNcDestroy();
}


3)exe中菜单响应
void CMainFrame::OnOpen1()
{
//g_Oper1是接口指针,在CMainFrame中OnCreate中创建
if(NULL != g_Oper1)
{
g_Oper1->opendlg();
}
}
...全文
261 点赞 收藏 12
写回复
12 条回复
worldy 2014年02月12日
引用 9 楼 xiaohuh421 的回复:
[quote=引用 7 楼 worldy 的回复:] MFC new出来的窗口对象在窗口卸载的时候,框架代码会调用delete,不需要人工删除。 CxTransformDlg* pTransForm=new CxTransformDlg; pTransForm->DoModal(); 其它什么都不做,你跟踪会发现,在窗口关闭的时候~CxTransformDlg()函数会自动被调用
不知道你的IDE是哪个版本. 在VS2008中, 你这样的代码肯定会内存泄漏, 除非CxTransformDlg类中像4楼那样删除了自己. new是肯定要与delete对应的, 没有对应就应该泄漏, 不泄漏就不正确.[/quote] CFrameWnd的派生类在2008,2010中都会自动删除,但CWnd CDialog的派生类不会被删除,(例子代码是我弄错了,会调用释构函数是因为我定义了一个成员变量引起) 测试发现,CFrmeWnd的派生类不能定义为非指针成员变量,否则关闭窗口的时候,会崩溃
回复 点赞
黑泡泡选手 2014年02月11日

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

	CDialog::PostNcDestroy();
	delete this;
}

void CSysCfgLocalDlg::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类
	DestroyWindow();
	//CDialog::OnCancel();
}
我是这么写的,好像没发现内存泄漏~ http://msdn.microsoft.com/en-us/library/5zba4hah.aspx
回复 点赞
xiaohuh421 2014年02月11日
CDlg *pDlg = new CDlg; pDlg->Create(IDD_DIALOG1,NULL); pDlg->ShowWindow(SW_SHOW); 光是new, 没有delete, 不漏才怪, 并且窗口在delete前还需要DestroyWindow
回复 点赞
makaayxjtu 2014年02月11日
调试过,确定进了PostNcDestroy
回复 点赞
黑泡泡选手 2014年02月11日
走到PostNcDestroy函数了麽?
回复 点赞
xiaohuh421 2014年02月11日
引用 10 楼 makaayxjtu 的回复:
感谢大家支持。 测试用的IDE是 VC6.0 我们测试的结果是:9个小时,模态对话框泄露9M左右,非模态对话框泄露4M左右。 这个问题困扰好久了,最近又出来了!
建议你, 能用模态的情况, 尽量都使用模态 XXXDlg dlg; dlg.DoModal(); 但是, 这种情情况下, 要注意你的delete this这东西, 因为不是new出来的,却delete肯定要出问题. 如果是实在是有非模态, 那么可以加个标记, 决定这个类是new出来的, 还是栈上生成的东西.
回复 点赞
makaayxjtu 2014年02月11日
感谢大家支持。 测试用的IDE是 VC6.0 我们测试的结果是:9个小时,模态对话框泄露9M左右,非模态对话框泄露4M左右。 这个问题困扰好久了,最近又出来了!
回复 点赞
xiaohuh421 2014年02月11日
引用 7 楼 worldy 的回复:
MFC new出来的窗口对象在窗口卸载的时候,框架代码会调用delete,不需要人工删除。 CxTransformDlg* pTransForm=new CxTransformDlg; pTransForm->DoModal(); 其它什么都不做,你跟踪会发现,在窗口关闭的时候~CxTransformDlg()函数会自动被调用
不知道你的IDE是哪个版本. 在VS2008中, 你这样的代码肯定会内存泄漏, 除非CxTransformDlg类中像4楼那样删除了自己. new是肯定要与delete对应的, 没有对应就应该泄漏, 不泄漏就不正确.
回复 点赞
xiaohuh421 2014年02月11日
引用 7 楼 worldy 的回复:
MFC new出来的窗口对象在窗口卸载的时候,框架代码会调用delete,不需要人工删除。 CxTransformDlg* pTransForm=new CxTransformDlg; pTransForm->DoModal(); 其它什么都不做,你跟踪会发现,在窗口关闭的时候~CxTransformDlg()函数会自动被调用
你说的这个正确与否先不说, 关键是他使用的不是DoModal,而是Create,再ShowWindow, 那肯定会泄漏的. DoModal的情况, 我马上验证下看看.
回复 点赞
worldy 2014年02月11日
MFC new出来的窗口对象在窗口卸载的时候,框架代码会调用delete,不需要人工删除。 CxTransformDlg* pTransForm=new CxTransformDlg; pTransForm->DoModal(); 其它什么都不做,你跟踪会发现,在窗口关闭的时候~CxTransformDlg()函数会自动被调用
回复 点赞
worldy 2014年02月11日
引用 3 楼 xiaohuh421 的回复:
CDlg *pDlg = new CDlg; pDlg->Create(IDD_DIALOG1,NULL); pDlg->ShowWindow(SW_SHOW); 光是new, 没有delete, 不漏才怪, 并且窗口在delete前还需要DestroyWindow
MFC new出来的窗口对象在窗口卸载的时候,框架代码会调用delete不需要删除。 CxTransformDlg* pTransForm=new CxTransformDlg; pTransForm->DoModal(); 其它什么都不做,你跟踪会发现,~CxTransformDlg()函数会自动被调用
回复 点赞
幻夢之葉 2014年02月11日
引用 3 楼 xiaohuh421 的回复:
CDlg *pDlg = new CDlg; pDlg->Create(IDD_DIALOG1,NULL); pDlg->ShowWindow(SW_SHOW); 光是new, 没有delete, 不漏才怪, 并且窗口在delete前还需要DestroyWindow
++ 在CIn中new,那你CIn某个地方肯定也需要delete pDlg啊
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7893

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告