这是MFC中的内存泄漏

Ric*_*ard 8 c++ mfc memory-leaks

// CMyDialog inherits from CDialog 
void CMyFrame::OnBnClickedCreate()
{
    CMyDialog* dlg = new CMyDialog();
    dlg->Create( IDD_MYDIALOG, m_thisFrame );
    dlg->ShowWindow( SW_SHOW );
}
Run Code Online (Sandbox Code Playgroud)

我很确定这个漏洞.我真正要问的是:当对话框被销毁时,MFC中是否存在对话清理的"魔力".如果dlg不是指针而是在堆栈上声明,它将如何工作 - 当dlg超出范围时,析构函数不会破坏窗口.

aJ.*_*aJ. 16

是的,在您的情况下是内存泄漏,但是如果通过使用覆盖在堆上分配无模式对话框,则可以避免内存泄漏PostNcDestroy.

对话框不适用于自动清理(主框架窗口,视图窗口).如果要为对话框提供自动清理,则必须覆盖PostNcDestroy派生类中的成员函数.要在类中添加自动清理,请调用基类,然后执行delete this.要从类中删除自动清理,请CWnd::PostNcDestroy直接调用而不是PostNcDestroy直接基类中的成员.

void MyDialog::PostNcDestroy() 
{

    CDialog::PostNcDestroy();
    delete this;
}
Run Code Online (Sandbox Code Playgroud)

这是如何工作的(来自MSDN):

销毁Windows窗口时,发送到窗口的最后一条Windows消息是WM_NCDESTROY.该消息的默认CWnd处理程序(CWnd :: OnNcDestroy)将从C++对象中分离HWND并调用虚函数PostNcDestroy.某些类重写此函数以删除C++对象.

"删除此"将释放与C++对象关联的任何C++内存.即使默认的CWnd析构函数调用DestroyWindow,如果m_hWnd是非NULL,这也不会导致无限递归,因为在清理阶段句柄将被分离并且为NULL.

您还可以参考MSDN(销毁窗口对象)以获取更多详细信息.

注意:

这适用于可在堆上分配的无模式对话框.