【发布时间】:2013-04-27 20:42:13
【问题描述】:
MS documentation(和others)“清楚地”声明:
... 因为 CDialog 的普通 OnOk 和 OnCancel 成员函数 对象将调用 EndDialog,确保您的无模式对话框确实 不调用这些函数而是覆盖
由于CDialog::OnOk 有效地调用CDialog::EndDialog,该方法看起来像:
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);
::EndDialog(m_hWnd, nResult);
}
我们还可以检查the docs for ::EndDialog 再次“明确”状态:
由 DialogBox、DialogBoxParam 创建的对话框, DialogBoxIndirect 和 DialogBoxIndirectParam 函数必须是 使用 EndDialog 函数销毁。应用程序调用 EndDialog 从对话框过程中;不得使用该功能 用于任何其他目的。
然而,我有一个 CDialog 派生类,它的默认行为是 wrt。 OnOKand 似乎当我使用非模态/非模态时一切正常。
即: * 当我关闭(无模式)对话框时,它会关闭/从视图中移除。 * 应用程序没有显示任何内存泄漏。 (MFC 调试构建)
那又怎样?我是否需要阻止EndDialog 并自己致电DestroyWindow或不需要?
注意:我知道文档和“网络”是怎么说的。只是我还没有找到为什么我需要做不同的事情,而且这个类应该可以用于无模式和模态模式,所以不必做任何不同的事情可能会很方便。 p>
【问题讨论】:
-
我怀疑你正在泄漏一个窗口。这不会在您的应用程序中显示为内存泄漏,因为窗口是由系统维护的。检查任务管理器中的“用户对象”列,查看值是否随时间增长。
标签: winapi visual-c++ mfc modal-dialog modeless