我有一个父对象,它引用了一个子对象,并且父对象还有一个事件处理程序来监听子对象的事件。
如果所有对父对象的引用都被释放,那么通过父对象和子对象占用的内存会在GC中被释放吗?(假设既没有对子对象也没有对父对象的引用存在)。
class ParentClass {
ChildClass _childClass;
public ParentClass(ChildClass childClass) {
_childClass = childClass;
childClass.SomeEvent += ChildClass_SomeEvent;
}
void ChildClass_SomeEvent(object sender, SomeEventArgs e) {
}
}
请注意,我知道GC不会立即作出反应。我的问题不是在释放父对象后内存是否立即被释放,而是内存是否被释放。更新:对于我来说,答案很明显,是的,GC能够解决这个循环引用。但是对于所有阅读此帖子并有类似问题的人,请小心不要将事件注册保持打开。它只是一个特殊的例子,在其中注册不是问题。在其他情况下,事件注册可能会导致严重的内存泄漏。vilx提供了一个非常好的涵盖此问题的资源:http://www.interact-sw.co.uk/iangblog/2004/07/07/circulareventrefs。