此事件处理代码是否会导致内存泄漏?

时间:2011-10-04 14:48:25

标签: c# memory-leaks .net-3.5 garbage-collection

这是内存泄漏吗?

private void Process()
{
    for (; ; )
    {
        // local variable
        RemoteClient remoteClient = new RemoteClient(..);
        // subscription without unsubscription
        remoteClient.BadClient += new EventHandler(remoteClient_BadClient); 
    }

..
}

public class RemoteClient
{
  ...
  public event EventHandler BadClient;
}

3 个答案:

答案 0 :(得分:2)

这取决于RemoteClient类中的其他内容。如果dispose没有对象,则表示没有内存泄漏。如果有任何具有IDisposable内容的对象,则需要继承ÌDisposable`并销毁这些对象。 另外,我认为删除处理程序和退出循环对你来说并不陌生。

因为客户端听起来像一个Web服务,所以看一下调用异步线程可能很重要。 .NET: Do I need to keep a reference to WebClient while downloading asynchronously?

如果整个东西变得更复杂,检查对象状态也很重要。 Complex client server

答案 1 :(得分:1)

如果您要退出for循环,这不是内存泄漏。每个remoteClient将保留对remoteClient_BadClient委托的引用,但remoteClient本身将适用于每次迭代后的垃圾收集(如果您不在其他地方存储对remoteClient的引用!) 。收集remoteClient也将处理remoteClient_BadClient代表的引用,这也将允许收集它。

答案 2 :(得分:0)

不,除非你处于无限循环中。