GC调用finalize()释放System.Drawing.Graphics的非托管资源时异常!该对象在其他地方使用!

葬爱の丫 2015-01-22 01:27:36
GC调用finalize()释放System.Drawing.Graphics的非托管资源时异常!提示该对象在其他地方使用!
在下百思不得解的是:GC如果已经决定调用某对象的finalize()时,说明此对象已经没有地方再引用了啊!也就是说肯定没地方使用了啊!为什么它释放资源的时候还会报异常,说该对象在其他地方使用!

我可以明确,此异常是GC自动调用finalize()时引发的,不是我手动调用Dispose()时引发的!

哪方大侠救我!着急ing.
...全文
234 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
葬爱の丫 2015-02-21
  • 打赏
  • 举报
回复
引用 5 楼 github_22161131 的回复:
.net上和gdi+相关的bug很多,你说的比较像这个:http://support.microsoft.com/kb/2650146 GC只能追踪托管资源,虽然这个对象在托管环境没有引用了,但是它或者它内部的东西可能还在非托管环境被使用。比如一些分配的gdi+的句柄,如果dispose的时候想释放它,但是这个时候gdi+自己判断这个句柄还有用,不允许释放,那就会错了。 Graphics类是标准的dispose模式,析构方法就是调用了Dispose(false)而已,自己调用Dispose相当于调用Dispose(true),然后GC.SuppressFinalize(this)。
那天下午我就找到问题所在了,一直没顾上上这里结贴。 原因和这位仁兄说的一致。 是由于我的代码中出现了异常然后直接catch了,所以跳过了我手动调用dispose以及释放gdi句柄的代码。所以系统GC会调用finalize,但由于还有没释放的句柄,所以报错了。 还是感谢各位相助!:)
winnowc 2015-01-22
  • 打赏
  • 举报
回复
.net上和gdi+相关的bug很多,你说的比较像这个:http://support.microsoft.com/kb/2650146 GC只能追踪托管资源,虽然这个对象在托管环境没有引用了,但是它或者它内部的东西可能还在非托管环境被使用。比如一些分配的gdi+的句柄,如果dispose的时候想释放它,但是这个时候gdi+自己判断这个句柄还有用,不允许释放,那就会错了。 Graphics类是标准的dispose模式,析构方法就是调用了Dispose(false)而已,自己调用Dispose相当于调用Dispose(true),然后GC.SuppressFinalize(this)。
於黾 2015-01-22
  • 打赏
  • 举报
回复
所以你还是将出错时的完整错误信息放出来分析,不要你自己觉得是这样,实际上可能根本不是那么回事
於黾 2015-01-22
  • 打赏
  • 举报
回复
dispose()方法只是通知GC可以对它进行回收了,并不是直接调用GC对它进行回收 包括GC.Collect()方法也只是通知GC该进行回收了,并不代表GC就会立即进行回收
葬爱の丫 2015-01-22
  • 打赏
  • 举报
回复
相关代码太多,我看看能不能整理下。 很多地方创建了System.Drawing.Graphics类型的局部变量,然后用完后,手动调用了此类的成员函数dispose()。 对了,希望你能明确告诉一下,是不是如果成功调用了System.Drawing.Graphics的dispose(),那么GC就不会再调用此对象的finalize()了呢? 我觉得它的dispose()中一定是写了GC.SuppressFinalize(this)的。
於黾 2015-01-22
  • 打赏
  • 举报
回复
把错误信息贴出来看,不能光听你的一面之词 否则你不如直接打电话给微软报bug,也不需要来问了

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧