最近写的程序实现过程中经常会弹出对话框,各种弹。为了方便,就直接点击左上角的叉叉来关闭对话框。在调试过程中就是各种各样的资源泄露问题。经过调试基本确认就是弹框再关闭过程中发生的泄露。
初始代码都是在WM_DESTROY消息中处理资源释放的,类似如下:
void CDlgXXX::OnDestroy()
{
CDialogEx::OnDestroy();
//资源释放
……………………
}
进行源码调试后,发现只有模态对话框(即DoModal函数创建的对话框)才进入了WM_DESTROY消息中,而非模态(即Create函数创建的对话框)的对话框是没有进入消息中的。查看MFC代码
INT_PTR CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);
// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC