我有关于.net垃圾收集的简单问题。在下面的代码中,我在子对象的构造函数中创建一个侦听器类实例。我的问题是侦听器类是否被子集或主对象之前的垃圾收集器收集,因为在任何地方都没有直接引用它?
class MainObject
{
public void DoSomething()
{
}
}
delegate void someEventHandler();
class ChildObject
{
public event someEventHandler SomeEvent;
MainObject main;
public ChildObject(MainObject main)
{
this.main = main;
new Listener(this, main);
}
}
class Listener
{
MainObject main;
public Listener(ChildObject child, MainObject main)
{
this.main = main;
child.SomeEvent += new someEventHandler(child_SomeEvent);
}
void child_SomeEvent()
{
main.DoSomething();
}
}
答案 0 :(得分:6)
在调用列表child.SomeEvent
中,是对它的引用。
悬空事件处理程序是.NET应用程序中内存泄漏的首要原因。
收集child
对象后将收集它,但是如果您希望在手边收集它,则需要将其从调用列表中删除(使用-=
运算符)。< / p>
答案 1 :(得分:2)
GC的目的是让您不必担心收集的时间。当它们不再需要而且没有特定的顺序时,它们就会被收集起来。无法保证在另一个对象之前收集一个对象。
答案 2 :(得分:1)
正如Oded所说,有一个参考。如果想避免这种情况,可以查看试图解决内存泄漏问题的弱事件模式: