0

嗨,我正在 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。我不相信这OnDestroyOnInitDialog相反的,但那是哪个功能呢?没有OnExitDialog

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

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

m_ModeTabs.DestroyWindow();

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

4

2 回答 2

1

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

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

于 2012-05-22T14:04:07.217 回答
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++ 库开发

于 2012-05-22T16:14:37.337 回答