您的位置:首页 > 编程语言

MFC内存泄漏的问题的其中一种情况

2012-10-16 21:37 225 查看
今天在编写程序的时候发现程序运行之后占用内存不断的增加,从2M到4M,程序自动中止了;

后来经过一番努力,其实是很简单的问题

MFC中我的OnDraw函数

void CBallView::OnDraw(CDC* pDC)
{
CDC *pWindowDC = GetDC();
CDC m_memDC;
CBitmap m_memBmp;
//1.用于映射屏幕的内存设备环境
//获取游戏窗口的大小用于下面设置内存位图的尺寸
CRect windowRect;
GetClientRect(&windowRect);
m_nWidth = windowRect.Width();
m_nHeight = windowRect.Height();

//内存设备环境与屏幕设备环境关联(兼容)
m_memDC.CreateCompatibleDC(pWindowDC);
//内存位图与与屏幕关联(兼容),大小为游戏窗口的尺寸
m_memBmp.CreateCompatibleBitmap(pWindowDC,m_nWidth,m_nHeight);
//内存设备环境与内存位图关联,以便通过m_memDC在内存位图上作画
m_memDC.SelectObject(&m_memBmp);
// TODO: add draw code for native data here
m_pWhitePen  = new CPen(PS_SOLID,1,RGB(255,255,255));

//画刷
m_pBlackBrush  = new CBrush(RGB(0,0,0));
DrawGame(&m_memDC);
pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);

}

内存泄漏的原因首先我是从OnTimer中发现的,因为函数中用了Invalidate(FALSE);

所以就会不断的调用OnDraw,问题就在OnDraw里面,其实在DrawGame函数前面的都只需要用一次就可以了,所以反复调用就会出现内存泄漏,详细的原因我也不懂,我就加入了一个布尔型的变量控制前面的一段只在程序一开始的时候运行,之后再调用OnDraw也不会再运行就解决这个问题了,我顺便还把m_memDC和m_memBmp放到头文件里面,最后代码如下

void CBallView::OnDraw(CDC* pDC)
{if(m_bFistPlay)
{
m_bFistPlay=false;
CDC *pWindowDC = GetDC();

//1.用于映射屏幕的内存设备环境
//获取游戏窗口的大小用于下面设置内存位图的尺寸
CRect windowRect;
GetClientRect(&windowRect);
m_nWidth = windowRect.Width();
m_nHeight = windowRect.Height();

//内存设备环境与屏幕设备环境关联(兼容)
m_memDC.CreateCompatibleDC(pWindowDC);
//内存位图与与屏幕关联(兼容),大小为游戏窗口的尺寸
m_memBmp.CreateCompatibleBitmap(pWindowDC,m_nWidth,m_nHeight);
//内存设备环境与内存位图关联,以便通过m_memDC在内存位图上作画
m_memDC.SelectObject(&m_memBmp);
// TODO: add draw code for native data here
m_pWhitePen  = new CPen(PS_SOLID,1,RGB(255,255,255));

//画刷
m_pBlackBrush  = new CBrush(RGB(0,0,0));
}
DrawGame(&m_memDC);
pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);

}


这样内存泄漏的问题就解决了,在我上网查询的过程中我发现很多内存泄漏的情况都是在绘图上资源没有释放或者反复使用所导致的,以后编程过程中要注意内存使用的变化情况或者用软件检测是否有内存泄漏的问题并解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 游戏 编程
相关文章推荐