VC 2010+MFC:CMFCVisualManager::GetInstance()导致的内存泄露 2012-2-15 10:18

  • Post author:
  • Post category:其他


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一下。



版权声明:本文为laohu6599原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。