当前位置: 首页 > news >正文

MFC如何实现new出来的非模态窗口关闭时自动释放资源

众所周知,new出来的CDialog窗体在堆中开辟控件,不手动进行释放会造成内存泄露

Modal dialog boxes are normally created on the stack frame and destroyed when the function that created them ends. The dialog object’s destructor is called when the object goes out of scope.
Modeless dialog boxes are normally created and owned by a parent view or frame window — the application’s main frame window or a document frame window. The default OnClose handler calls DestroyWindow, which destroys the dialog-box window. If the dialog box stands alone, with no pointers to it or other special ownership semantics, you should override PostNcDestroy to destroy the C++ dialog object. You should also override OnCancel and call DestroyWindow from within it. If not, Don’t call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it.
You should override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.

1、非模态对话框是在堆中产生,必须要释放;模态对话框在栈中,过了作用域会自动释放
2、此时用IDOK,IDCANCEL关闭窗体时,应对OnOK,OnCancel重写,CDialog::OnOK();CDialog::OnCancel();应被替换为CDialog::DestroyWindow()。因为前者是会调用CDialog::EndDialog, 其是为模态对话框而设计,非模态调用它只能隐藏窗体而不会释放。
3、如果对话框为游离状态(指父窗体或其他窗体没有掌控指向该对话框的指针),就需要重载PostNcDestroy, 当然父窗体有该模态对话框的指针CDlg* pDlg,在适当的时候delete pDlg即可
总之:先DestroyWindow, 然后delete
用PostNCDestory将windows内核对象销毁,调用delete把对话框的c++对象销毁。
对于一个mfc的对话框对象,它实际上分为两部分,一部分是系统内核对象,用句柄标识,一部分是用于包装这个句柄的c++对象


我尝试对窗体类覆写以下函数

void myDlg::PostNcDestroy()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialog::PostNcDestroy();
	delete this;
}
void myDlg::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialog::OnCancel();
	DestroyWindow();
}

或者直接

void myDlg::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialog::OnCancel();
	DestroyWindow();
	delete this;
}

参考
非模态对话框的释放

相关文章:

  • 鹏牛网做网站怎么样/中国军事新闻最新消息
  • wordpress web主题公园/推广网站的公司
  • 竞猜网站开发多少钱/东莞seo计费管理
  • 杭州做网站的优质公司哪家好/网站seo属于什么专业
  • 重庆工程造价信息/seo技术教程博客
  • 网站管理助手4.0 mysql/网站seo怎么操作
  • Docker 详解及安装
  • 笔试强训48天——day3
  • 软件测试基础(七)—— Python(五)之面向对象(封装、继承、多态)
  • Cookie与Session是如何联动的?
  • Linux 驱动开发 六十:《input.txt》翻译
  • 【ZooKeeper】ZooKeeper企业应用
  • python语言思想
  • 冯.诺伊曼体系
  • 从最基础的角度认识 kotlin协程
  • 二十七、《大数据项目实战之用户行为分析》Hive分析搜索引擎用户行为数据
  • 【网站】比较知名的大型公司官网清单可以收藏关注一下,欢迎您来补充
  • pytorch 神经网络特征可视化