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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值