VC 2010的MFC函数,CMFCVisualManager::GetInstance()可能导致内存泄露。对此,VC2010的MFC类库并没有作处理。
导致泄露的代码位置:
\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxvisualmanager.h 的 484行。
static CMFCVisualManager* __stdcall GetInstance()
{
if (m_pVisManager != NULL)
{
ASSERT_VALID(m_pVisManager);
return m_pVisManager;
}
if (m_pRTIDefault == NULL)
{
m_pVisManager = new CMFCVisualManager; //内存泄露代码
}
else
{
m_pVisManager = (CMFCVisualManager*) m_pRTIDefault->CreateObject();
ASSERT_VALID(m_pVisManager);
}
m_pVisManager->m_bAutoDestroy = TRUE;
m_pVisManager->OnUpdateSystemColors();
return m_pVisManager;
}
对VC 2010的此问题,可以使用下面的方法修复:
在C××App中,重载虚函数ExitInstance,并加入如下代码:
int C××App::ExitInstance()
{
CMFCVisualManager * pVisualManager=CMFCVisualManager::GetInstance();
if (pVisualManager!=NULL)
{
delete pVisualManager;
}
return __super::ExitInstance();
}
到网上搜索了一下,找到了答案。原因在于VS2008中MFC程序中的应用程序类都派生自CWinAppEx,VS 2008的程序里有一个CMFCVisualManager类的全局对象,负责管理可视化界面,具体来说就是一个单件(设计模式中的单件模式),CWinAppEx类的ExitInstance函数可以析构这个对象。但是以往的MFC程序的应用程序类都派生自CWinApp,因为需要在ExitInstance函数手动这个类对象,具体就是在应用程序类的ExitInstance函数添加代码
CMFCVisualManager::DestroyInstance( TRUE );
但是我看微软自己的demo却没有泄漏这方面的问题,也不是winappex类,奇怪,mark一下。