VC 2010的MFC函数,CMFCVisualManager::GetInstance()可能导致内存泄露

本文澄清了关于MFC应用中CMFCVisualManager内存泄露的问题,指出使用CWinAppEx而非CWinApp可避免该问题,并提供了解决方法。通过重载虚函数ExitInstance并加入关键代码片段,可以修复内存泄露。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在网上看到一篇文章,关于CMFCVisualManager的内存泄露问题( 链接是 http://zhanyonhu.blog.163.com/blog/static/1618604420113208121859/),当然还有其他的关于CMFCButton控件也有内存泄露问题,乱七八糟扯蛋,网上很多的误导文章,写这个澄清一下。


其实他的文章有误导,使用MFC的新特性功能,你的应用程序类CXXXApp是要继承于CWinAppEx,而不是CWinApp,这样就不存在所谓的内存泄露。如果重写了ExitInstance函数,最后也要加一句:


return CWinAppEx::ExitInstance();



附:全文摘录如下


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();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值