创建非模态对话框释放内存的问题
2009-05-09 20:27
295 查看
若给非模态对话框设置了父窗口,则应该在父窗口中销毁对话框窗口,释放对话框的C++指针。
m_pDlg:应用程序中对话框的指针,初始值为NULL;
CDlg是对话框类名称;
m_listWnd:应用程序中存储CDlg的指针
当应用程序打开非模态对话框时,因要保存其类指针,所以必须在对话框被销毁时,释放自己的资源。这里分两种情况:
1.对于只打开一次的非模态对话框。
需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。
还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
这样,其父窗口就不需要代码来管理该非模态对话框内存的释放。
2.对于可重复打开的对话框:
可在m_listWnd中保存所有曾经打开过的对话框指针,应用程序中打开窗口的程序如下:
CDlg* pDlg=new CDlg();
pDlg->ShowWindow(SW_SHOW);
pDlg->UpdateWindow();
m_listWnd.push_back(pDlg);
在应用程序的OnDestroy()中:
遍历m_listWnd,然后
if(pDlg){
if(IsWindow(pDlg->m_hWnd)){
pDlg->DestroyWindow();
}
SAFE_DELETE(pDlg);
}
在CDlg中也应该重载OnCancel,并调用DestroyWindow。因为C++指针的释放是在其父窗口完成的,所以没必要重载PostNcDestroy。
在CDlg::OnDestroy()中,只需释放掉自己所创建的资源即可。
KillTimer()函数,在CWnd()类中,不能放在析构函数中。因为KillTimer()在删除定时器时,是需要m_hWnd句柄的,但是当程序运行到析构函数,窗口已经被销毁,m_hWnd已经变为NULL,所以会出错。
m_pDlg:应用程序中对话框的指针,初始值为NULL;
CDlg是对话框类名称;
m_listWnd:应用程序中存储CDlg的指针
当应用程序打开非模态对话框时,因要保存其类指针,所以必须在对话框被销毁时,释放自己的资源。这里分两种情况:
1.对于只打开一次的非模态对话框。
需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。
还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
这样,其父窗口就不需要代码来管理该非模态对话框内存的释放。
2.对于可重复打开的对话框:
可在m_listWnd中保存所有曾经打开过的对话框指针,应用程序中打开窗口的程序如下:
CDlg* pDlg=new CDlg();
pDlg->ShowWindow(SW_SHOW);
pDlg->UpdateWindow();
m_listWnd.push_back(pDlg);
在应用程序的OnDestroy()中:
遍历m_listWnd,然后
if(pDlg){
if(IsWindow(pDlg->m_hWnd)){
pDlg->DestroyWindow();
}
SAFE_DELETE(pDlg);
}
在CDlg中也应该重载OnCancel,并调用DestroyWindow。因为C++指针的释放是在其父窗口完成的,所以没必要重载PostNcDestroy。
在CDlg::OnDestroy()中,只需释放掉自己所创建的资源即可。
KillTimer()函数,在CWnd()类中,不能放在析构函数中。因为KillTimer()在删除定时器时,是需要m_hWnd句柄的,但是当程序运行到析构函数,窗口已经被销毁,m_hWnd已经变为NULL,所以会出错。
相关文章推荐
- 因WKWebview导致视图控制器释放不掉而内存崩溃的问题
- 频繁分配释放内存导致的性能问题的分析
- 关于在dll中申请内存,外部释放的问题
- 解决Webbrowser定时抓取网页数据时,内存累积不释放的问题
- 在 JScript 中释放内存、批量加载问题及其他
- linux频繁存取文件内存不释放问题
- 创建内存图层不成功的问题
- C++释放内存的问题
- for环中创建map,创建的是一个map对象还是多,map和内存的问题
- Linux开发心得总结2 - 频繁分配释放内存导致的性能问题的分析
- JS中关于对内存的释放问题[待续]
- 频繁分配释放内存导致的性能问题的分析
- 关闭窗体不释放内存问题
- session不及时释放导致内存溢出的性能问题分析
- 编程过程中常见的内存开辟和释放问题
- delete void* 释放内存问题(C++)
- C++之二叉树的创建、查找、四种次序的周游遍历方法以及内存的释放
- 应用模板类解决临时内存的释放问题
- [CALayer release]: message sent to deallocated instance iOS内存过度释放问题
- perl 释放内存问题【转】