嗨,我正在使用以下方法在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
.我不认为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
导致它的原因。
以为你不说,我假设m_ModeTabs是你的CClockMasterDlg的子窗口。 在这种情况下或类似情况下,您不必显式调用 DestroyWindow。当窗口被 Win32 销毁((时,其所有子窗口也会被销毁。
由于您已将m_ModeTabs声明为常规变量(而不是指针(,因此在 CClockMasterDlg 的析构函数期间,C++运行时将自动释放它拥有的内存。
我实际上遇到了一个错误,该错误将"在 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 的主要版本。
帕特·布伦纳 视觉C++库开发