Вызывает ли этот код обработки событий утечку памяти? - PullRequest
2 голосов
/ 04 октября 2011

Это утечка памяти?

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 ]

2 голосов
/ 04 октября 2011

Это зависит от того, что еще находится в классе RemoteClient.Если НЕТ объекта dispose, это не утечка памяти.Если есть какие-либо объекты с содержимым IDisposable, вам нужно унаследовать «Disposable» и уничтожить эти объекты.Также не новость удалить обработчик и цикл выхода, я думаю.

Поскольку клиент звучит как веб-сервис, может быть важно взглянуть на асинхронные потоки. .NET: Нужно ли сохранять ссылку на WebClient при асинхронной загрузке?

Также, если все становится более сложным, важно проверить состояние объектов.Complex client server

1 голос
/ 04 октября 2011

Это не утечка памяти, если вы выйдете из цикла for.Каждый remoteClient будет содержать ссылку на remoteClient_BadClient делегат, но сам remoteClient будет применяться для сборки мусора после каждой итерации (если вы не сохраните ссылку на remoteClient где-то еще!).Сбор remoteClient также приведет к удалению ссылки на делегат remoteClient_BadClient, что также позволит собрать его.

0 голосов
/ 04 октября 2011

Нет, если только вы не в бесконечном цикле.

...