代码之家  ›  专栏  ›  技术社区  ›  webnoob

系统、图纸和垃圾收集

  •  3
  • webnoob  · 技术社区  · 16 年前

    正如一些人可能意识到的,我最近在我的网站上发布了关于内存使用率高的消息,我有一个想法,我的拇指钉可能与此有关,因为我没有积极处理由于我对如何工作的误解而被使用的实例。

    我现在正在查看我的拇指钉程序代码,并希望得到一些关于何时实际需要处理某个对象的建议,是否只有在创建对象的新实例时才需要处理?

    像:

    Target := System.Drawing.Bitmap.Create(Trunc(Width), Trunc(Height));
    MyImage := Target.FromFile(PhotoPath);
    

    所以,我的问题是,我是否需要同时处理target和myimage以确保gc正确地完成它需要做的事情?

    谢谢。

    5 回复  |  直到 16 年前
        1
  •  6
  •   Todd Main    16 年前

    在msdn上查看此日志: .NET Memory Leak: To dispose or not to dispose, that’s the 1 GB question . 建议您应该处理。

        2
  •  4
  •   Lasse V. Karlsen    16 年前

    作为一项总的政策,我会把这个问题抛在脑后:

    我有什么理由不处理这些特殊物品吗

    如果类实现 IDisposable 处理它是你的工作。

    在许多情况下,尽管对象在您处理它时做的不多,但这并不意味着您不应该对它调用Dispose。如果您升级到新的.NET运行时版本,可能已经改变了。

    好吧,让我澄清一下我在这里说的话。

    当然我不是说你应该打电话 Dispose 在任何和所有实现 不可分的 . 问题是, 是你的目标吗 . 如果你建造了它,那是你的责任。

    如果你被给予了这个物体,假设它不是你的,除非你特别要求给予这个物体,而不是暂时借给你。

    当然也有其他例外,但是 一般来说 ,您拥有该实现的对象 不可分的 ,完成后处理它们。

        3
  •  2
  •   Steven    16 年前

    Image 实现一次性。你处理完后应该把它处理掉。对图像进行处理是非常重要的。它们只分配了几个字节的托管内存,但引用了大量的本机内存。

        4
  •  2
  •   Guffa    16 年前

    是的,两个调用都会导致创建新的 Bitmap 对象,因此在处理完它们后需要对它们进行处置。

    您还应该知道,您可能正在使用的其他与图形相关的对象也需要被释放,例如 Graphics , Brush 和 Font .

        5
  •  1
  •   Henk Holterman    16 年前

    是的 ,处置您创建的IDisposables。当然在GDI里+

    最好是在 using() {} 块。

    using (Pen p = new Pen(Colors.Blue))  // Dispose this pen
    {
        Brush b = Brushes.Green; // but not this Brush
        ....
    }
    
    推荐文章