⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_15482.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:15482 发表者:阿华 发表日期:2002-09-18 17:00:46
<br>主题:高手帮忙看一下为什么这段程序执行久了就会把内存吃光光?
<br>内容:void CJHIView::OnDraw(CDC* pDC)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CRect ClientRect;<BR>&nbsp;&nbsp;&nbsp;&nbsp;GetWindowRect(ClientRect);///////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;int width = ClientRect.Width();<BR>&nbsp;&nbsp;&nbsp;&nbsp;int height = ClientRect.Height ();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CDC MemDC; //首先定义一个显示设备对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;CBitmap MemBitmap;//定义一个位图对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//随后建立与屏幕显示兼容的内存显示设备<BR>&nbsp;&nbsp;&nbsp;&nbsp;MemDC.CreateCompatibleDC(NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//这时还不能绘图,因为没有地方画 ^_^<BR>&nbsp;&nbsp;&nbsp;&nbsp;//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小<BR>&nbsp;&nbsp;&nbsp;&nbsp;MemBitmap.CreateCompatibleBitmap(pDC,width ,height );<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//将位图选入到内存显示设备中<BR>&nbsp;&nbsp;&nbsp;&nbsp;//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上<BR>&nbsp;&nbsp;&nbsp;&nbsp;CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//先用背景色将位图清除干净,这里我用的是白色作为背景<BR>&nbsp;&nbsp;&nbsp;&nbsp;//你也可以用自己应该用的颜色<BR>&nbsp;&nbsp;&nbsp;&nbsp;MemDC.FillSolidRect(0,0,width , height , RGB(192,192,192));<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//绘图<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (CountFlag)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawTextAndLine(m_strEdit1,&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawCountNum(&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawChart(&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (FastTestFlag)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawFastText(&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FastDrawFailOrPass(&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//将内存中的图拷贝到屏幕上进行显示<BR>&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;BitBlt(0,0,width ,height,&MemDC,0,0,SRCCOPY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//绘图完成后的清理<BR>&nbsp;&nbsp;&nbsp;&nbsp;MemBitmap.DeleteObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(&MemDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;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 + -