代表会导致内存泄漏吗?
我的意思是,例如如果类A
包含ADelegate
而后者指向BMethod
(B
类),这是否会阻止GC的A类或B类集合? / p>
如果是这样,我们如何“释放”代表(设置ADeletate = Nothing
/ null?)
你如何评论这个:
//Class A Finalize, containing ADelegateInstance as ADelegate'
protected override void Finalize()
{
ADelegateInstance =
(ADelegate)System.Delegate.RemoveAll(
ADelegateInstance, ADelegateInstance);
ADelegateInstance = null;
base.Finalize();
}
'Class A Finalize, containing ADelegateInstance as ADelegate'
Protected Overrides Sub Finalize()
ADelegateInstance = _
CType(System.Delegate.RemoveAll(ADelegateInstance, ADelegateInstance), _
ADelegate)
ADelegateInstance = Nothing
MyBase.Finalize()
End Sub
答案 0 :(得分:8)
是的,除非您取消订阅活动,否则参考文件将保持活动状态:
someObject.SomeEvent -= SomeDelegate;
答案 1 :(得分:2)
AFAIK,只要仍然引用了闭包/委托,闭包/委托引用的上下文确实不能被垃圾收集 - 否则它将失去其上下文。
以此answer为例,我们看到委托可以在对象的上下文中引用变量inneri
。因此,在委托不再被引用之前,实际持有inneri
的对象不能被垃圾收集,在这种情况下,直到Button
被垃圾收集。
for (int i = 0; i < 7; i++)
{
var inneri = i;
Button newButton = new Button();
newButton.Text = "Click me!";
newButton.Click += delegate(Object sender, EventArgs e)
{
MessageBox.Show("I am button number " + inneri);
};
this.Controls.Add(newButton);
}
相关帖子:
答案 2 :(得分:2)
仅提供引用不足以导致内存泄漏。请考虑以下事项。
如果一个线程产生3个对象(其中 - &gt;表示一个引用),A - &gt; B - &gt; C - &gt;甲
如果线程没有引用A,则会收集所有内容。循环引用由GC处理。
但是,这显然也意味着,如果委托包含对象的引用,并且仍然引用该委托的对象,则不会清除委托函数。
这将为您提供以下内容。
A - (带代表的对象) B - 包含函数引用的对象。
当A超出范围时,B将会。
答案 3 :(得分:1)
如果A包含B中函数的委托,则GC不会销毁A.
每次写“mydelegate + = B.method”时总是加入“mydelegate - = B.method”是个好主意。
虽然它不是真正的内存泄漏,因为仍然可以访问对象。
答案 4 :(得分:0)
在ASP.NET应用程序中存在使用单例的情况。由于某种原因,它曾经订阅控件事件。事实上,它是一个单身人士(包含对自身的引用)不允许GC收集它,另一方面,单身人士从未删除控制事件的订阅。这导致了内存消耗的持续增长:用于提供单个请求的控件由于单例的现有引用而未由GC清除,为每个新请求创建了新控件。