当前位置: 代码迷 >> C# >> Graphics.DrawImage() 步骤内存泄露
  详细解决方案

Graphics.DrawImage() 步骤内存泄露

热度:685   发布时间:2016-05-05 04:53:01.0
Graphics.DrawImage() 方法内存泄露
    在循环中调用Drawimage方法,进行图像的拼接,内存上涨很快,请问什么原因啊
------解决思路----------------------
图像资源没有释放吧
非托管资源需要手动执行
对象.Dispose()
------解决思路----------------------


你拼命的画,又没有Dispose当然溢出了。
------解决思路----------------------
用using语句块啊


using(Graphic g = CreateGraphic)
{
    //出了语句块自动Dispose
}

------解决思路----------------------
此外,不要看到内存上升就说什么"内存泄露"
你要看内存是否上升之后会稳定在某个值,或者有时升上去,过一段时间又降下来

你一下申请那么多内存用来画图,内存必然会上升的,而且很可能不会马上降下来(即使已经释放资源)
你只要确保它不会一直上升一直到内存不足就行了
------解决思路----------------------

来看拉圾回收来不及回收了。
------解决思路----------------------
引用:
这是截取网页截图,全图的方法,我已经做了释放,最后将g2也释放掉了,为什么会泄露呢。

在while?加个Thread.Sleep(10)
------解决思路----------------------
你一张图片大小有10个G?
还是说这个函数你反复执行了许多次之后,内存才达到14G的?
------解决思路----------------------
PrintWindow(hwnd, hdc, 0);里又干啥了
------解决思路----------------------
你把Dispose放循环里啊亲。。。
------解决思路----------------------
啊  看差大括号了
你找找调用的方法中,有没有new出来对象的,那种也释放掉
------解决思路----------------------
g2.DrawImage,你最终把图像画到哪里去了?
g2不过是画图用的工具,它本身不是图像
图像对象呢(比如Image还是bmp)?释放了吗
------解决思路----------------------
难道写代码 非得在一个过程里面写完,可以分成好几个小的模块去写呀。
------解决思路----------------------
眼晕!好多Dispose和=null
建议你不要定义成全局变量然后在循环里反复使用
在循环里定义,用using包起来,这样不需要手动去释放,也不会不小心漏掉了某个变量的释放代码
更不会因为执行过程中出错而不执行释放的代码

finally是对应try的
只有在try里出错时,finally不管是否出错都会执行
而如果在执行try之前就已经出错,那么finally也不会执行
------解决思路----------------------
工程属性->代码分析->启用
选所有规则,编译

其中一条检查,凡是可以Dispose的,你没有Dispose就会有一条提示。先利用这个排查一下吧
  相关解决方案