首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GC.Collect()是否处理Font (或任何已实现IDisposable的实例)对象.net 4.0 C#内存泄漏

GC.Collect()是否处理Font (或任何已实现IDisposable的实例)对象.net 4.0 C#内存泄漏
EN

Stack Overflow用户
提问于 2014-11-20 00:22:27
回答 1查看 417关注 0票数 0

我有一个C# .net 4.0用户控件,它使用大量的字体和图形对象。此控件多次打开和关闭,并泄漏内存。在处理该控件时,我将调用GC.Collect。我的问题是,如果System.Graphics对象用于例如字体、刷子而不用“使用”或不显式地处理它,那么GC.Collect()是否会清除该对象工具。

代码语言:javascript
复制
   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()是否要释放和释放字体对象使用的资源。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 00:30:48

一般来说,您不需要调用GC.Collect()。在问题中包含的代码示例中,应该在f方法中显式地处理AssignFont()对象:

代码语言:javascript
复制
void AssignFont()
{
    using( Font f = new Font("Arial Narrow", 8))
    {
        // do something with 'f' here
    }
}

这需要您的代码示例的表面值。如果您要以某种方式将对f对象的引用从方法中传递出去,这将改变事情。

你不清楚你所谓的“漏记忆”是什么意思。一般来说,在.NET程序中不会发生这种情况。托管对象由垃圾收集器自动清除,使用非托管资源的正确编写的对象将具有终结器,如果它们有非托管资源来清理,则允许GC也清理这些资源。最常见的“泄漏”实际上是“打包”;也就是说,您仍然保留对不想要的对象的引用,阻止GC清理它们,任何数量的调用GC.Collect()都不会处理这种错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27029601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档