LINUX.ORG.RU

Memory leak in C#

 


0

1

Мне сейчас тут сказали, что в C# может быть утечка памяти в случае, если мы забыли отписаться от события.

Можете привести пример кода, когда такое произойдет? На stackoverflow я не нашел внятных примеров.

Я не очень понимаю, откуда возьмется ссылка на неиспользуемый объект. Ведь если ссылка есть, значит он используется.

Это частный случай более общей утечки. Скажем, есть некий список или массив, например, глобальный. Обработчики событий хранятся в чем-то похожем, только не глобальная структура, а привязанная к чему-то. Так вот, кладем туда объект и забываем. Тот список или массив по-прежнему живой, и он хранит твой объект. Почему твой объект должен удаляться?

Утечки памяти в C# и Java определенно бывают, как и в Haskell, и Ocaml, но это ничто по сравнению с утечками памяти в C/C++/Pascal.

dave ★★★★★ ()

Здесь достаточно внятно описано: http://stackoverflow.com/questions/3662842/how-do-events-cause-memory-leaks-i... . Забывают удалить ссылку на обработчик, который является частью «удаляемого» объекта. Это не классическая утечка памяти, так как обработчик остается доступным через событие, к которому он приписан. И если удалить объект с событием, удалится и объект с обработчиком.

amm ()

Только имей в виду, что если объект, к которому подписываешься становится удаляемым (т.е. недостижимым строго говоря), то тогда по фигу, отписываешься ты от события или нет. Тот объект с событием будет удален вместе с твоим объектом, имеющим обработчик, даже если обработчик не отписан.

Тут надо четко представлять, что могут быть удалены недостижимые объекты. Если объект становится недостижимым, то можно на него забить.

Распространенная ошибка новичков: отписываются от события, даже если в этом нет никакой необходимости в случае, описанном выше.

В общем, нужна практика, чтобы это все понять. Это нормально, что возникают вопросы.

dave ★★★★★ ()

Еще дополню. Тут может возникнуть циклическая зависимость, когда два объекта хранят ссылки друг на друга. Ничего особенно сложного, но нужно проявлять осторожность.

dave ★★★★★ ()
Ответ на: комментарий от dave

Тут может возникнуть циклическая зависимость, когда два объекта хранят ссылки друг на друга. Ничего особенно сложного, но нужно проявлять осторожность.

Сборщик мусора спокойно справляется с циклическими ссылками. В чем проблема?

anonymous ()
Ответ на: комментарий от anonymous

При чем здесь это? Просто выглядит как вырванная из контекста фраза с надуманным вопросом.

dave ★★★★★ ()
Ответ на: комментарий от dave

Да, спасибо

Я смог воспроизвести, но тут не имеет значения, ивенты это или нет, т.к. я могу такую же ситуацию воспроизвести и без ивентов, это, видимо, меня и запутало.

Я думал, что это связано с реализацией именно событий.

По поводу циклических ссылок, согласен с анонимумом, к чему это, сборщик это спокойно разрешает.

Опыт-то есть, просто я не воспринимал такую ситуацию как утечку памяти. Как выше написали, это не похоже на классическую утечку.

chkalov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.