首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何正确关闭窗口而不发生资源泄漏 [已结贴,结贴人:cuilonggang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cuilonggang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 20:07:28 楼主
    请描述一下如何添加合适的代码,处理非模态对话框关闭的过程,最后正确释放资源。
    请包含如下问题的解答:
    1.是否必须onclose消息映射?
    2.是否必须代码明确调用DestroyWindow()?
    3.是否必须ondestroy消息映射?
    4.释放资源是在OnClose中好还是在OnDestroy中好,为什么?
    5.比如在OnClose()中调用CDialog::OnClose();,应是在自己的代码之前调用还是之后调用?
    6.模态对话框处理有何不同?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • thankall
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 20:30:541楼 得分:1
    注意释放资源与内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • flm007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 20:44:122楼 得分:2
    释放资源不是在哪释放合适,你在哪不用了就要把它释放掉,养成好的编程习惯!


    OnClose当然是要在调用之后你才能关闭,如果你程序还在运行中你强制关闭,程序会崩溃
    除非你有做特殊处理!

    onclose消息相应函数,当关闭窗口的时候会出发这个事件


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      13

    发表于:2008-08-21 21:13:443楼 得分:90
    1.是否必须onclose消息映射?
    用户操作关闭窗口就是通过WM_CLOSE消息实现的,如果不响应这个消息就不会关闭窗口。

    2.是否必须代码明确调用DestroyWindow()?
    如果要销毁窗口肯定是要调用DestroyWindow,如果不销毁窗口就是资源泄露了。

    3.是否必须ondestroy消息映射?
    不是必须的,根据需要来决定。

    4.释放资源是在OnClose中好还是在OnDestroy中好,为什么?
    根据具体情况来定,差别不大,只要确保代码能被执行到且释放后的资源不会被使用即可。

    5.比如在OnClose()中调用CDialog::OnClose();,应是在自己的代码之前调用还是之后调用?
    对于非模态对话框,CDialog::OnClose没有实际意义,不调用都可以。

    6.模态对话框处理有何不同?
    模态对话框不要调用DestroyWindow,模态对话框的关闭是对话框自己处理的,如果要在程序中关闭对话框,要用EndDialog函数。

    另外补充一点,非模态对话框经常用new来构造,对话框关闭时自己来delete,这种情况需要重载PostNcDestroy函数来delete this。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cuilonggang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 21:38:284楼 得分:0
    谢谢!请问第5个问题,通常的顺序是如何的?比如
    void CMyDlg::PostNcDestroy()
    {
    // TODO: Add your specialized code here and/or call the base class
    delete this;
    CDialog::PostNcDestroy();
    }
    按通常的顺序,自己的代码(delete this),应该在CDialog::PostNcDestroy()之前还是之后呢?
    是否特殊情况特殊考虑还是有通常的顺序?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xsc2001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 22:27:415楼 得分:2
    1.是否必须onclose消息映射?
    不用在程序里添加这个消息映射,你在需要关闭时只要向窗口发送WM_CLOSE消息即可。

    2.是否必须代码明确调用DestroyWindow()?
    不用明确调用DestroyWindow(),你发送WM_CLOSE消息或者CloseWindow()都可以,它们都会在关闭窗口时调用DestroyWindow。

    3.是否必须ondestroy消息映射?
    不是必须的,根据实际情况按需要来决定。

    4.释放资源是在OnClose中好还是在OnDestroy中好,为什么?
    这个无所谓,就看你的资源具体是什么资源了,不过最好把释放资源的代码放在类的析构函数里。

    5.比如在OnClose()中调用CDialog::OnClose();,应是在自己的代码之前调用还是之后调用?
    自己的代码应该放在CDialog::OnClose();之前。

    6.模态对话框处理有何不同?
    模式对话框的销毁最好是通过OnCancle()或者OnOk()
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Devang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 23:06:116楼 得分:2
    1,你在自己的类中,比如视图类中响应菜单消息
    C/C++ code
    if(dlg != NULL) dlg->SetFocus(); else { dlg = new CXXXdlg(this); // 可以把this保存为对话框类成员,发送消息用. dlg->Create(IDD_XXXXXX); dlg->ShowWindow(SW_SHOW); }

    dlg是视图类成员,CXXXdlg是你的对话框类,IDD_XXXXXX是对话框ID,在视图类构造和析构函数中加入dlg = NULL;

    2,对话框类
    [color=#C0C0C0]2.1构造函数,
    C/C++ code
    CXXXdlg::CXXXdlg(CWnd* pParent /*=NULL*/) : CDialog(CXXXdlg::IDD, pParent) { //{{AFX_DATA_INIT(CXXXdlg) //}}AFX_DATA_INIT m_pParent = pParent; }
    [/color]
    2.2 在OnOK()去掉CDialog::OnOK();
    OnCancel()去掉CDialog::OnCancel();  用DestroyWindow();代替,,或做别的,
    或发送自定义消息m_pParent->SendMessage();
    2.3
    C/C++ code
    void CXXXdlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class m_pParent->SendMessage(WM_SETUP_DELETE); // 让视图类做些处理 m_pParent = NULL; delete this; CDialog::PostNcDestroy(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      13

    发表于:2008-08-21 23:15:137楼 得分:0
    引用 4 楼 cuilonggang 的回复:
    谢谢!请问第5个问题,通常的顺序是如何的?比如
    void CMyDlg::PostNcDestroy()
    {
    // TODO: Add your specialized code here and/or call the base class
    delete this;
    CDialog::PostNcDestroy();
    }
    按通常的顺序,自己的代码(delete this),应该在CDialog::PostNcDestroy()之前还是之后呢?
    是否特殊情况特殊考虑还是有通常的顺序?

    delete this放在最后,因为delete this之后对象就不存在了,所以要等其它代码都执行完后再执行它。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tunnel115
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 08:20:478楼 得分:1
    学习,我也是对这个问题很迷惑
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • coolstar14
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:22:549楼 得分:1
    关都关了, 只要程序运行时不泄露, 退出时不弹出错误框来, 也是可以接受的.

    虽然上面的不是好习惯, 但即很有效.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linuxrat
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 15:01:1310楼 得分:1
    mark自己也做的不地道的,关注
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved