【问题标题】:Does this cause a memory leak (in .NET)?这会导致内存泄漏(在 .NET 中)吗?
【发布时间】:2010-02-23 01:02:09
【问题描述】:

我有一个内存泄漏问题。在 TopClass 的类实例超出范围之前,obj 的实例是否有资格进行垃圾回收?

public class TopClass
{
  public void MyFunction()
  {
    TestClass obj = new TestClass();
    obj.PropertyChanged += (s,e) => { //Do some code };
    obj = null;
  }
}

此外,这将使所有实例化 TopClass 并调用 MyFunction() 的对象都没有资格进行 GC 对吗?

我知道在托管代码中,一旦应用程序超出范围,所有对象都符合条件,但我想知道在我的应用程序运行时这会导致内存泄漏。对吧?

【问题讨论】:

    标签: .net memory-management


    【解决方案1】:

    不。 obj 将被收集好。此代码中的任何内容都不会导致强引用。

    对象可以通过作为事件处理程序附加来保持活动状态,但对象不能通过事件处理程序保持活动状态。

    【讨论】:

    • 是的,可以在调用 MyFunction 之后(甚至期间)立即收集 TestClass 实例。
    【解决方案2】:

    obj 只要您将其设置为 null,就会有资格进行垃圾回收(但实际的回收当然会在稍后完成)。订阅PropertyChanged 事件不会创建对obj 的引用,它会创建从obj 到TopClass 实例的引用。它也不会阻止收集 TopClass 实例,除非它在其他地方被引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多