【MFC】Visual Studio 2010中CMFCVisualManager 引起的内存泄露

xiaoxiao2021-02-28  27

1、现象。

编译VS2010 MFC程序(该工程基于对话框)时出现内存泄漏,如下所示:

Detected memory leaks! Dumping objects -> {847} client block at 0x0160E720, subtype c0, 212 bytes long. a CMFCVisualManager object at $0160E720, 212 bytes long Object dump complete.

对比以前代码,发现问题出在一个新加进工程名为CMFCPropertyGridCtrl的控件上。屏蔽掉该控件在工程中所用动作,包括初始化,发现内存泄漏依然存在。删除控件(该控件为静态创建)后,内存泄漏消失。

 

2、解决方法。

介于问题比较诡异,上网百度“CMFCVisualManager”、“内存泄漏”关键词,发现如下解决办法

在App类中重载ExitInstance()成员函数,加入如下代码。

int CHelloApp::ExitInstance() { CMFCVisualManager::DestroyInstance(TRUE); return CWinApp::ExitInstance(); }

 

3、原因。

下面,介绍一下发生内存泄漏的原因。

本工程是由向导产生的基于对话框工程,CHelloApp基于CWinApp。

class CHelloApp : public CWinApp { public: CEzCadToolApp(); // 重写 public: virtual BOOL InitInstance(); // 实现 DECLARE_MESSAGE_MAP() virtual int ExitInstance(); };

对比由VS2010向导产生的SDI或MDI工程,CTestApp默认是CWinAppEx类产生。

class CTestApp : public CWinAppEx { public: CTestApp(); // 重写 public: virtual BOOL InitInstance(); virtual int ExitInstance(); // 实现 UINT m_nAppLook; BOOL m_bHiColorIcons; virtual void PreLoadState(); virtual void LoadCustomState(); virtual void SaveCustomState(); afx_msg void OnAppAbout(); DECLARE_MESSAGE_MAP() };

因此,推测CWinAppEx::ExitInstance()函数自动对工程中所采用的CMFCVisualManager对象(如CMFCPropertyGridCtrl、CVCVSListBox等控件)释放资源,而CWinApp::ExitInstance()没有这个能力,因此需要重写。

本人拙见,不妥之处,欢迎拍砖。

 

4、参考资料。

解决CMFCVisualManager 引起的内存泄露  https://blog.csdn.net/LifeForToday/article/details/45391777

关于BCG界面库  https://blog.csdn.net/pizi0475/article/details/7825389

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-2628583.html

最新回复(0)