我有一个C# .net 4.0用户控件,它使用大量的字体和图形对象。此控件多次打开和关闭,并泄漏内存。在处理该控件时,我将调用GC.Collect。我的问题是,如果System.Graphics对象用于例如字体、刷子而不用“使用”或不显式地处理它,那么GC.Collect()是否会清除该对象工具。
void AssignFont()
{
Font f = new Font("Arial Narrow", 8);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
// Free any other managed objects here.
GC.Collect();
}
// Free any unmanaged objects here.
disposed = true;
}这只是一个简单的例子,我知道我们应该使用语句调用System.Graphics对象。我的问题是,如果没有使用are调用这些数据,然后从Dispose方法中调用GC.Collect,那么会怎样呢?
GC.Collect()是否要释放和释放字体对象使用的资源。
发布于 2014-11-20 00:30:48
一般来说,您不需要调用GC.Collect()。在问题中包含的代码示例中,应该在f方法中显式地处理AssignFont()对象:
void AssignFont()
{
using( Font f = new Font("Arial Narrow", 8))
{
// do something with 'f' here
}
}这需要您的代码示例的表面值。如果您要以某种方式将对f对象的引用从方法中传递出去,这将改变事情。
你不清楚你所谓的“漏记忆”是什么意思。一般来说,在.NET程序中不会发生这种情况。托管对象由垃圾收集器自动清除,使用非托管资源的正确编写的对象将具有终结器,如果它们有非托管资源来清理,则允许GC也清理这些资源。最常见的“泄漏”实际上是“打包”;也就是说,您仍然保留对不想要的对象的引用,阻止GC清理它们,任何数量的调用GC.Collect()都不会处理这种错误。
https://stackoverflow.com/questions/27029601
复制相似问题