📄 subject_15482.htm
字号:
<p>
序号:15482 发表者:阿华 发表日期:2002-09-18 17:00:46
<br>主题:高手帮忙看一下为什么这段程序执行久了就会把内存吃光光?
<br>内容:void CJHIView::OnDraw(CDC* pDC)<BR>{<BR> CRect ClientRect;<BR> GetWindowRect(ClientRect);///////////<BR> int width = ClientRect.Width();<BR> int height = ClientRect.Height ();<BR> <BR> CDC MemDC; //首先定义一个显示设备对象<BR> CBitmap MemBitmap;//定义一个位图对象<BR> <BR> //随后建立与屏幕显示兼容的内存显示设备<BR> MemDC.CreateCompatibleDC(NULL);<BR> //这时还不能绘图,因为没有地方画 ^_^<BR> //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小<BR> MemBitmap.CreateCompatibleBitmap(pDC,width ,height );<BR> <BR> //将位图选入到内存显示设备中<BR> //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上<BR> CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);<BR> <BR> //先用背景色将位图清除干净,这里我用的是白色作为背景<BR> //你也可以用自己应该用的颜色<BR> MemDC.FillSolidRect(0,0,width , height , RGB(192,192,192));<BR> <BR> //绘图<BR> if (CountFlag)<BR> {<BR> DrawTextAndLine(m_strEdit1,&MemDC);<BR> DrawCountNum(&MemDC);<BR> DrawChart(&MemDC);<BR> } <BR> else <BR> if (FastTestFlag)<BR> { <BR> DrawFastText(&MemDC);<BR> FastDrawFailOrPass(&MemDC);<BR> }<BR><BR> //将内存中的图拷贝到屏幕上进行显示<BR> pDC->BitBlt(0,0,width ,height,&MemDC,0,0,SRCCOPY);<BR> <BR> //绘图完成后的清理<BR> MemBitmap.DeleteObject();<BR> ReleaseDC(&MemDC);<BR> MemDC.DeleteDC();<BR>}<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:TopLevel 回复日期:2002-09-18 17:22:57
<br>内容:最后恢复时应该这样。<BR>....<BR>if( pOldBit )<BR>{<BR> MemDC.SelectObject( pOldBit );<BR>}<BR>MemBitmap.DeleteObject();<BR>MemDC.DeleteDC();<BR>ReleaseDC就不用了。<BR>这段代码没看出大的毛病,是不是在你所调用的函数中,牵涉到内存分配,而没进行释放的缘故。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Aikoc 回复日期:2002-09-18 20:28:13
<br>内容:主要问题就是没释放bmp,<BR>如果bmp正被DC使用,是不能释放的.<BR><BR>if( pOldBit )<BR>{<BR> MemDC.SelectObject( pOldBit );<BR>}<BR>MemBitmap.DeleteObject();<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:孔刚 回复日期:2002-09-18 21:25:31
<br>内容:由于OnDraw会被经常调用,如果为变量分配的内存未被彻底释放,则再大的内存迟早也会被吃尽的。建议在此函数中定义变量的地方设上断点(可以在调试中获得其内存地址),别忘了在函数的最末设上断点,当调试运行到函数末尾时,可以在Memory中输入其内存地址,这样可以确定变量是否被真正释放。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -