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(销毁窗口对象)以获取更多详细信息.
注意:
这适用于可在堆上分配的无模式对话框.