做GC.Collect() 处理字体(或任何已实现 IDisposable 的实例)对象 .net 4.0 C# 内存泄
本文关键字:net 对象 实例 内存 实现 处理 Collect GC 字体 任何 IDisposable | 更新日期: 2023-09-27 18:31:11
我有一个C# .net 4.0用户控件,它使用大量字体和图形对象。此控件多次打开和关闭,并泄漏内存。我正在打电话给GC。收集在"释放此控件"中。我的问题是,例如字体,画笔的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;
}
这只是一个简单的例子,我知道我们应该使用 using 语句调用 System.Graphics 对象。我的问题如果不使用 using 然后 GC 调用这些怎么办。收集是从 Dispose 方法调用的。
是 GC。Collect() 将释放并释放 Font 对象使用的资源。
一般来说,你不应该需要调用GC.Collect()
。在问题中包含的代码示例中,应在 AssignFont()
方法中显式释放 f
对象:
void AssignFont()
{
using( Font f = new Font("Arial Narrow", 8))
{
// do something with 'f' here
}
}
这从表面上看您的代码示例。如果您以某种方式将对f
对象的引用传递到方法之外,那将改变事情。
您不清楚"泄漏内存"是什么意思。通常,这不会在 .NET 程序中发生。托管对象由垃圾回收器自动清理,如果使用非托管资源的正确写入的对象具有要清理的非托管资源,则它们将具有终结器,从而允许 GC 也清理这些资源。最常见的"泄漏"实际上是"包装嘎嘎作响";也就是说,您仍然保留对你不打算的对象的引用,阻止 GC 清理它们,并且再多的调用GC.Collect()
都不会处理这种错误。