Graphic对象会自动释放吗?还需要调用.Dispose();吗?

ningweidong 2010-12-21 04:09:35
我调用Graphic对象的方法,
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.DrawString("ning",this.Font,Brushes.Black,10,10);
g.Dispose();//这一句话,要还是不要?
}
首先创建了一个Graphics对象,在函数结尾的时候,需要手动释放资源吗?

我的理解是,g是一个栈中的对象,函数一退出,系统就会自动释放它。
可它为什么还有g.Dispose();方法?这句话到底要不要写?我觉得写不写都差不多,请问一下,写和不写有什么区别?
...全文
1451 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningweidong 2010-12-22
  • 打赏
  • 举报
回复
因为它用了create,所以要释放,否则就不用
  • 打赏
  • 举报
回复
如果是自己建立的如Graphics g = this.CreateGraphics()一定要释放
如果是绘制事件或者重绘函数里的参数传过来的则不要释放,否则可能出错
OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;//这个不要释放
rabbitlzx 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gomoku 的回复:]

要。

你关于“g是一个栈中的对象,函数一退出,系统就会自动释放它”的理解有误。
g引用的对象在堆上,不主动释放的话就要等到垃圾清理的时候才会释放。

Graphics是一种‘稀缺’资源,要及时释放。
[/Quote]

[Quote=引用 6 楼 vrhero 的回复:]

Graphics是引用类型,怎么可能“是一个栈中的对象,函数一退出,系统就会自动释放它”这么简单?

Graphics与特定的设备上下文关联,属于非托管资源,必须显式释放...任何非托管资源都必须显式释放...

否则等到GC调用垃圾对象的Finalize方法之前,可能发生设备争用或死锁等不可预料的问题...
[/Quote]

顶这两个,有些回复简直就是在胡说八道啊,不明白千万不要误导人
vrhero 2010-12-21
  • 打赏
  • 举报
回复
如果是自己写的非托管资源操作对象,又没有实现析构函数...不显式释放资源,内存泄漏是必然的...
shadan05 2010-12-21
  • 打赏
  • 举报
回复
Graphics这个还是要释放,他不是一个单纯的对象,加了就是告诉垃圾回收这东西可以释放了。
vrhero 2010-12-21
  • 打赏
  • 举报
回复
Graphics是引用类型,怎么可能“是一个栈中的对象,函数一退出,系统就会自动释放它”这么简单?

Graphics与特定的设备上下文关联,属于非托管资源,必须显式释放...任何非托管资源都必须显式释放...

否则等到GC调用垃圾对象的Finalize方法之前,可能发生设备争用或死锁等不可预料的问题...
Dobzhansky 2010-12-21
  • 打赏
  • 举报
回复
要的
关键的不是 .net 对象的释放问题

是 Graphics 所管理的 win32 gdi 对象需要
flowfog 2010-12-21
  • 打赏
  • 举报
回复
可要可不要;要的话可以加快GC回收
dasheen919 2010-12-21
  • 打赏
  • 举报
回复
VS自从有个GC垃圾回收机制,程序员们就可以自由的编写代码而不用去考虑资源释放的问题了,它会在合适的时候释放掉你不用的资源!

当然,也会有手动的方式来实现释放!类里有构造方法,也有析构方法(就是前面加上“~”),这时遍可以用到Dispose()手动释放资源!
gomoku 2010-12-21
  • 打赏
  • 举报
回复
要。

你关于“g是一个栈中的对象,函数一退出,系统就会自动释放它”的理解有误。
g引用的对象在堆上,不主动释放的话就要等到垃圾清理的时候才会释放。

Graphics是一种‘稀缺’资源,要及时释放。
zyf1990818 2010-12-21
  • 打赏
  • 举报
回复
我认为这句话是不可以省略的,g.Dispose();的作用是释放调用的资源,这就像SqlConnection的对象一样,如果不是写在using语句块内的都不会自动释放的,所以这句话不可以省略

110,534

社区成员

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

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

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