Самый простой способ создать утечку памяти - это неправильно использовать средства, предназначенные для взаимодействия, поскольку они имеют дело с неуправляемой памятью.
Например, выделите GCHandle
, указывающий на объект, и никогда не освобождайте его.
Редактировать: Есть ли какие-то нормальные, безвредные способы использования, которые могут вызвать утечки памяти?
Только один, о котором я знаю, особенно в некоторых программах с пользовательским интерфейсом. Это было возможно в WinForms, но только недавно стало распространенным благодаря WPF с MVVM:
Ключевым моментом, который многие упускают из виду, является то, что делегат содержит ссылку на объект, над которым он работает.
Таким образом, если используется шаблон, такой как MVVM, с двусторонними привязками (реализованный с использованием событий, состоящих из делегатов), и если представление изменяется на другое представление с той же моделью представления, по умолчанию обновления модели представления остаются привязан к обоим представлениям, что приводит к утечке старого представления.
Теоретически это может произойти с любым делегатом, но на практике это не распространено, поскольку подписчик, как правило, переживает издателя или отписывается.
Аналогичная ситуация возникает, когда отписываются обработчики лямбда-событий:
timer.Elapsed += (_, __) => myObj.Notify();
timer.Elapsed -= (_, __) => myObj.Notify();
В этом случае, хотя лямбда-выражения идентичны, они представляют разные обработчики, поэтому событие Elapsed
все равно вызовет Notify
. Вторая строка выше не имеет никакого эффекта; не отписывается и не выдает ошибку.
Обратите внимание, что неправильные отписки обычно обнаруживаются во время тестирования, поэтому они редко вызывают "утечки" в выпущенном коде. Напротив, описанная выше ситуация с MVVM не вызывает видимых побочных эффектов (кроме утечки памяти и ресурсов).