关于delete问题

wangsiyuanoo 2009-08-17 11:53:38
一个基于对话框的工程CDlg1
然后在工程里又添加了一个对话框CDlg2
想在CDlg1上放一个按钮去控制CDlg2的显示
这些都实现了
我有在CDlg2里new,然后想再调用CDlg2的析构函数把他delete掉
但发现关闭CDlg2的时候根本不会进到他的析构中,请问原因?

后面我想那就在CDlg1的析构函数中delet
但他就一直在这段代码上delete g_pAutoDelLogDlg->m_pSQLToolsDlg;不往下执行了!这又是什么原因呢?
...全文
94 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
TearyWang 2009-08-19
假如,你在一个函数体中,定义了一个 CDlg2 的对象 dlg2,那个这个对象dlg2的生存期就是 从定义开始,到与其最近的一个作用域(可以理解为一个块,{}之间)中,或是从定义开始,到dlg2主动调用其析构函数之间。
回复
wangsiyuanoo 2009-08-18
两个对话框是非模式的
在2中的一个退出按钮里,写:this->DestroyWindow();//销毁对话框
可还是不能进到2的析构中。。。。。。。。
回复
wangsiyuanoo 2009-08-18
[Quote=引用 3 楼 tttyd 的回复:]
但发现关闭CDlg2的时候根本不会进到他的析构中,请问原因?
这只是关闭窗口,不是释放CDlg2类对象的内存空间,因此不会
[/Quote]
那如何释放CDlg2类对象的内存空间呢?
回复
xylicon 2009-08-17
一个对象的退出肯定会调用析构函数的,没有调用析构函数,说明你的对象没有释放,代码是有问题的。

如果CDlg2 是new出来,而没有调用delete对象,那么Cdlg2就有可能到不了析构函数那里去。
回复
雪影 2009-08-17
但发现关闭CDlg2的时候根本不会进到他的析构中,请问原因?
这只是关闭窗口,不不是释放CDlg2类对象的内存空间,因此不会


不往下执行了!这又是什么原因呢?
不往下执行了指的是什么?内存异常吗?m_pSQLToolsDlg指针是否为空?
回复
roman_v 2009-08-17
CDlg2的析构函数?
回复
岁月小龙 2009-08-17
up
回复
TearyWang 2009-08-17
假设 CDlg2 窗口 对象被放到了 CDlg1 类中,成为CDlg1类的成员, 那反 CDlg2对象,在CDlg1对象的构造函数中构造。当CDlg1被析构时,CDlg2被析构。
请注意:对话框关闭,不再表对话框对象被析构。对话框对象的生存期,一定比这个对象所产生的对话框的显示期长。

m_pSQLToolsDlg指针,应该是定义在CDlg2内部的,是由CDlg2 执行的 new 操作,因此,其释放应该由 CDlg2来完成。否则可能导致出错(Heap异常)。

以下是提外话:
CDlg2是对话框,其显示方式有两种,一种是有模式对话框(用调用DoModal()使其显示的),另一种是无模式对话框(调用CreateWindow()显示的)。无模式的对话话,需要通过DestroyWindow()来销毁窗口(使其再显示,指示不再使用。)

回复
yayafu 2009-08-17
CDlg2的对象你根本就没销毁,当然不会调用析构函数了,你要销毁CDlg2嘛
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告