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

噔里个噔 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();
}
}
...全文
334 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
噔里个噔 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出来的, 还是栈上生成的东西.
噔里个噔 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啊

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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