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

来源:互联网 发布:阿里巴巴大数据竞赛 编辑:程序博客网 时间:2024/05/22 07:03

今天在网上看到一篇文章,关于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();
}

原创粉丝点击