关于delete问题

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

后面我想那就在CDlg1的析构函数中delet
但他就一直在这段代码上delete g_pAutoDelLogDlg->m_pSQLToolsDlg;不往下执行了!这又是什么原因呢?
...全文
122 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2009-08-17 11:53
社区公告

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