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

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

3 голосов
/ 30 июля 2010

У меня есть класс, показанный ниже. Экземпляр сервера содержит ссылку на экземпляр слушателя. Слушатель содержит ссылку на экземпляр сервера через делегат события. Это помешает GC собирать экземпляр сервера? Если так, как разорвать этот цикл? Должен ли я реализовать IDisposable или переопределить метод Finalize или сделать что-то еще?

public class Server
    {        
        public Listener Listener { get; private set; }        

        public Server(Listener listener)
        {
            Listener = listener;
            Listener.ClientChannelConnected += new EventHandler<ClientChannelConnectedArgs>(listener_ClientChannelConnected);
        }        

        void listener_ClientChannelConnected(object sender, ClientChannelConnectedArgs e)
        {
            ...
        }
}

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Странно, я обнаружил, что этот тип кода постоянно просачивается в .net, и должен был быть осторожен с - = обработчиком событий. Это правда, что память освобождается в конце концов , но на практике вы хотите очистить себя раньше, чем это.

Кроме того, никогда никогда не используйте лямбда-выражение для обработки события, поскольку у вас никогда не будет ссылки на этот объект.

1 голос
/ 30 июля 2010

Нет. Сборщик мусора .NET достаточно умен, чтобы разрешать циклические ссылки.

0 голосов
/ 30 июля 2010

Читать эту статью о утечках памяти . Иногда вы должны использовать - =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...