【问题标题】:DestroyWindow in OnDestroy not workingOnDestroy 中的 DestroyWindow 不起作用
【发布时间】:2012-05-22 13:53:34
【问题描述】:

您好,我正在 MFC 中制作一个基于对话框的应用程序:

BOOL CClockMasterDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

m_ModeTabs.Create(this,WS_CHILD | WS_VISIBLE, 0);
}

如果我在使用 CClockMasterDlg::OnInitDialog 创建函数后销毁 m_ModeTabs

m_ModeTabs.DestroyWindow();

当我把它放在CClockMasterDlg::OnDestroy() 中时,我没有得到内存但是泄漏了我得到了内存泄漏,即使它被调用并返回true 也很难。 我不相信OnDestroyOnInitDialog 的相反,但那是哪个功能呢?没有OnExitDialog

检测到内存泄漏! 倾倒对象 -> {601} 0x00AEED48 的客户端块,子类型 c0,212 字节长。 一个CMFCVisualManager 对象$00AEED48,212 字节长 对象转储完成。 程序[5312] ClockMaster.exe: Native 已退出,代码为 2 (0x2)。

即使很难,窗口也应该自动销毁,因为它不是指针,我仍然不应该出现内存泄漏吗?而且自从放置了

m_ModeTabs.DestroyWindow();

OnInitDialog 函数创建后解决了内存泄漏问题,它真的不能是其他原因造成的麻烦吗?删除m_ModeTabs.Create(... 也解决了内存泄漏,所以我很确定它是m_ModeTabs 造成的。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    你没说,我假设 m_ModeTabs 是你的 CClockMasterDlg 的子窗口。在这种情况下或类似情况下,您不必显式调用 DestroyWindow。当 Win32 对窗口进行 Destroy() 处理时,它的所有子窗口也会被销毁。

    由于您将 m_ModeTabs 声明为常规变量(而不是指针),它所拥有的内存将在 CClockMasterDlg 的析构函数期间由 C++ 运行时自动释放。

    【讨论】:

    • 但是,当我不手动销毁窗口时,为什么会出现内存泄漏?
    • 找出 CMFCViaualManager 对象的分配位置。在它的构造函数中放置一个断点——假设它有一个。从那里开始。
    【解决方案2】:

    我实际上遇到了一个错误,该错误将“在 MFC 中为 Visual Studio 的下一个主要版本修复”。

    在仅对话框 mfc 应用程序中使用 CVSListBox 时会发生内存泄漏。

    可以在此处找到有关该错误的信息和几种解决方法:

    https://connect.microsoft.com/VisualStudio/feedback/details/646445/cvslistbox-produces-memory-leaks

    http://connect.microsoft.com/VisualStudio/feedback/details/565327/memory-leaks-using-c

    还有一份关于这个错误的报告:

    http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/8870974f-1414-4dd7-b7c3-a1c320c0e91e

    引用第一个链接:

    你好,

    感谢您的报告。此问题已在 MFC 中修复 Visual Studio 的主要版本。

    Pat Brenner Visual C++ 库开发

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 2016-09-19
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多