关于模态对话框的销毁与内存释放的问题?

baizhaoshan 2008-11-05 12:18:42
我我采用模态对话框来设计界面,ADlg为主对话框,主界面
下面有二级界面BDlg、CDlg
还有三级界面B1Dlg、C2Dlg

目前我在ADlg中 通过 BDlg bdlg; bdlg.DoModal();来显示B界面

在BDlg中通过EndDialog(IDOK);B1Dlg b1dlg; b1dlg.DoModal();销毁BDlg,显示B1界面

在B1Dlg中通过EndDialog(IDOK);CDlg cdlg; cdlg.DoModal();销毁B1Dlg,显示C界面

目前这么做界面能够显示,貌似没什么问题。

但我总感觉EndDialog(IDOK)之后内存并没有释放,如果多调用些界面,内存可能会溢出。不知我的猜测是否正确?如果这么做内存会溢出,那么该如何解决这个问题呢?

谢谢了!
...全文
349 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baizhaoshan 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
你以为一个对话框类的实例能占多大内存?类看起来大是因为成员函数多吧,但函数占用的是指令区,占用栈内存的只是类的成员变量,但是成员变量占不了多少内存,除非某个成员变量定义成char buf[1MByte]就会导致栈溢出,但是用CString buf就只会占几个字节,因为它内部是指针。
只要你的类里没有很大的数组,也不使用无限嵌套调用的话,基本不用担心内存不够的问题。
[/Quote]
类里面没有很大的数组,但按我现有调用方式极可能会产生无限嵌套。
dayong576 2008-11-05
  • 打赏
  • 举报
回复
LZ的窗体对象只要不是New出来的没有关系的,放心用吧。
如果是New出来的话,必须要释放了不释放的话肯定会内存泄漏的
liuweibit 2008-11-05
  • 打赏
  • 举报
回复
绝大多数指针都是要程序员通过语句来释放的,而变量或是其它的都是系统自动会回收.
dch4890164 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
你以为一个对话框类的实例能占多大内存?类看起来大是因为成员函数多吧,但函数占用的是指令区,占用栈内存的只是类的成员变量,但是成员变量占不了多少内存,除非某个成员变量定义成char buf[1MByte]就会导致栈溢出,但是用CString buf就只会占几个字节,因为它内部是指针。
只要你的类里没有很大的数组,也不使用无限嵌套调用的话,基本不用担心内存不够的问题。
[/Quote]
正解,但是我有所补充
=====================================================
实际上,如果对话框上的控件很多的话,是占用程序内存的,而且占用的都是gdi object属于系统资源的一种
非常典型的就是,控件多了刷屏变慢,在wince下对这点更有体会
baizhaoshan 2008-11-05
  • 打赏
  • 举报
回复
帖子结的太快了,吃饭的时候细想了一下,如果cnzdgs 的说法做的话,还是会陷入无限循环。在一个B1对话框返回后判断返回值,然后显示C对话框,然后C又返回显示B,这样还是无限嵌套了。

我这里的主要问题是A B C为一级界面,A为主界面,A1、B1、C1为二级界面,在A2、B2、C2为三界面,要实现的功能是在一、二和三级界面中都可以返回到一级界面中,这是通过用户输入来确定。

怎么都感觉是设计有问题,望高手指点一下。

我给帖子加分了。O(∩_∩)O哈哈~
baizhaoshan 2008-11-05
  • 打赏
  • 举报
回复
其实我的对话框都是通过键盘的按键消息来响应的
貌似我的这种设计对话框的方式有问题哈
baizhaoshan 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
你这种设计思路不好,建议这样做:在对话框中,如果要关闭自身并显示另一个对话框,可以用EndDialog关闭自身,通过EndDialog的参数来告诉调用者,由调用者来显示另一个对话框;调用DoModal显示对话框之后,判断DoModal的返回值,这个返回值就是对话框中调用EndDialog时所给的参数,根据返回值来决定是否显示另一个对话框;对话框对象可以用new构造,用delete销毁,这样不会长时间占用内存。
[/Quote]
这个方法不错,我本想的是通过POST消息发送到主窗口,然后通过主窗口来创建新对话框,但是这样的话会出现闪屏。
Tinary3v0 2008-11-05
  • 打赏
  • 举报
回复
同意楼上,同时
你声明的是类的对象,使用的EndDialog会自动调用Dialog的析构函数释放内存的,即便是有一些残留估计也是你Dialog当中声明了
指针或资源没有释放,在各个Dialog的析构函数中将这些指针都 delete了就行了。 数组使用delete []; CDC的指针使用ReleaseDC释放;
FONT BRUSH PEN BMP等资源使用DeleteObject?都释放了就行了。
问题应该不是在你的对话框本身,而是它使用的东西里面。
jameshooo 2008-11-05
  • 打赏
  • 举报
回复
你以为一个对话框类的实例能占多大内存?类看起来大是因为成员函数多吧,但函数占用的是指令区,占用栈内存的只是类的成员变量,但是成员变量占不了多少内存,除非某个成员变量定义成char buf[1MByte]就会导致栈溢出,但是用CString buf就只会占几个字节,因为它内部是指针。
只要你的类里没有很大的数组,也不使用无限嵌套调用的话,基本不用担心内存不够的问题。
cnzdgs 2008-11-05
  • 打赏
  • 举报
回复
你这种设计思路不好,建议这样做:在对话框中,如果要关闭自身并显示另一个对话框,可以用EndDialog关闭自身,通过EndDialog的参数来告诉调用者,由调用者来显示另一个对话框;调用DoModal显示对话框之后,判断DoModal的返回值,这个返回值就是对话框中调用EndDialog时所给的参数,根据返回值来决定是否显示另一个对话框;对话框对象可以用new构造,用delete销毁,这样不会长时间占用内存。

15,980

社区成员

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

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