System.Drawing中的类不调用Dispose会不会造成资源泄漏?

uoyevoli 2005-08-09 07:10:21
用.net中的Graphics,Brush,Bitmap等类创建的对象,是不是需要手工调用Dispose释放资源呢??
如果不手工调用,而GC有没有及时回收,会不会造成GDI+资源不足呢?

以前使用C++的,C++的 CDC,CBitamp,CBrush等有析构函数,在超出作用域时这些对象的析构函数会自动调用DeleteDC,DeleteObject API来释放GDI资源的,C#中这样写会不会有问题??(WinForm)
while(true)
{
System.Drawing.Graphics g = this.CreateGraphics();
SolidBrush b = new SolidBrush(Color.Red);
//...
//...
//用g和b进行绘画
Application.DoEvents();
}
...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
uoyevoli 2005-08-10
  • 打赏
  • 举报
回复
到底Drawing里的GDI+对象不调用Dispose会不会有资源泄漏啊?
Johnnyxy 2005-08-10
  • 打赏
  • 举报
回复
如果是频繁创建Grphics对象就会,因为还来不及自动回收就有新的产生,不是经常创建就不会,因为系统已经回收了。
Johnnyxy 2005-08-09
  • 打赏
  • 举报
回复
我做过试验的。是这样的:
新建一个Bitmap对象,由于有图要更新,所以很快就用这个对象进行new,然后我在进城里面看内存使用情况是节节攀升,但是过一定的时间间隔,内存占用会下降比较明显,总的来说下降的少于增加的,过不了几分钟电脑就显示内存不足了。最后我在每次要new之前+了个dispose,随便多久都不会出错。个人观点:如果不是平凡生成新对象可以不用Dispose,如果是我这种情况恐怕应该适当使用
CMIC 2005-08-09
  • 打赏
  • 举报
回复
sniper81(零度的火)不要误导楼主, 一般里面Dispose方法里面都是释放非托管代码占用的资源,非托管代码占用的资源是不会被GC收集的,所有最好手动调用Dispose方法。
sswv 2005-08-09
  • 打赏
  • 举报
回复
显式释放的好.
我做过一个渐变色滚动条控件,不显式释放就出错,加上显式释放就正常了。怪。
uoyevoli 2005-08-09
  • 打赏
  • 举报
回复
手工调用Dispose()会不会有负面影响?
sniper81 2005-08-09
  • 打赏
  • 举报
回复
不会资源泄漏,据我了解,如果你不手工调用Dispose方法的话,当GC需要回收资源的时候,会自动调用Dispose方法。但是如果你手工调用Dispose方法的话,可以达到更早的释放资源的效果,所以,可以的话,还是手工调用比较好。
zhilunchen 2005-08-09
  • 打赏
  • 举报
回复
GDI资源是有限的,建议还是显式释放的好.
nik_Amis 2005-08-09
  • 打赏
  • 举报
回复
up

110,538

社区成员

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

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

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