代表会导致内存泄漏吗?

时间:2010-02-09 08:46:43

标签: .net memory-leaks delegates

代表会导致内存泄漏吗?

我的意思是,例如如果类A包含ADelegate而后者指向BMethodB类),这是否会阻止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

5 个答案:

答案 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清除,为每个新请求创建了新控件。