做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() 处理字体(或任何已实现 IDisposable 的实例)对象 .net 4.0 C# 内存泄

一般来说,你不应该需要调用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()都不会处理这种错误。