OnDestroy中的DestroyWindow无法正常工作

时间:2012-05-22 13:53:34

标签: c++ mfc

您好我正在使用以下方法在MFC中创建基于对话框的应用程序:

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

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

如果我使用以下内容在m_ModeTabs函数中销毁CClockMasterDlg::OnInitDialog,那么

m_ModeTabs.DestroyWindow();

当我将它放入CClockMasterDlg::OnDestroy()时,我没有记忆但是泄漏我得到了内存泄漏,甚至很难被调用并返回true。 我不相信OnDestroy OnInitDialog是相反的,但那么功能是什么?没有OnExitDialog

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

即使是强硬的窗口应该被自动销毁,因为它不是指针,我仍然不应该因为内存泄漏?自从放置

m_ModeTabs.DestroyWindow();

OnInitDialog函数创建后解决了内存泄漏问题,它真的不能引起其他问题吗?删除m_ModeTabs.Create(...也解决了内存泄漏问题,因此我非常确定其m_ModeTabs导致内存泄漏。

2 个答案:

答案 0 :(得分:1)

以为你没说,我假设m_ModeTabs是CClockMasterDlg的子窗口。在这种情况下,或类似的情况下,您不必显式调用DestroyWindow。当一个窗口由Win32编辑Destroy()时,它的所有子窗口也会被销毁。

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

答案 1 :(得分:1)

我实际上遇到的一个错误是“在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 ++库开发