Visual Studio 2010中CMFCVisualManager 引起的内存泄露
程序员文章站
2022-06-17 10:50:19
...
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
上一篇: JDK8 ArrayList源码解读