Правильная очистка памяти

244
29 марта 2018, 06:18

Как правильно реализовать очистку памяти? Посмотрел примеры: docs.microsoft, msdn, metanit.

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

Например вот часть класса таблицы:

   #region fields
    private List<Module> _allModule;
    #endregion
    #region constructors
    public ModuleTable(List<Module> allModule)
    {
        _allModule = allModule;
    }
    #endregion

Как правильно реализовать очистку памяти для такого класса с применением интерфейсов IDisposable?

Answer 1

В .NET есть два вида памяти — управляемая и неуправляемая.

Явное освобождение управляемой памяти практически никогда не нужно, главное, чтобы на неё не было ссылок из «корневых» объектов. При этом её при недостатке памяти съест сборщик мусора.

Важные случаи, когда необходимо «вручную» заботиться об освобождении управляемой памяти: вы подписываетесь на событие у долгоживущего объекта, при этом у объекта есть неявно ссылка на ваш объект, а значит, ваш объект не будет убран сборщиком мусора. Методы борьбы с этим — отписка от события в момент, когда она больше не нужна, или использование WeakEventManager.

Неуправляемую память нужно оборачивать в объект, реализующий IDisposable (например, SafeHandle). Когда она не нужна, ещё нужно освободить при помощи Dispose. (Об этом в деталях здесь.) Впрочем, освобождать IDisposable нужно и если за ними нет неуправляемой памяти.

Конкретно для вашего случая, у вас не видно ни подписок на события, ни других методов попасть в глобальные списки. Если ваш Module реализует IDisposable и вы — владелец объектов, то вы должны в нужный момент вызвать Dispose. Иначе по идее ничего делать не надо, разве что обнулите ссылку на ваш объект из долгоживущего объекта и ждите, пока объект съестся сборщиком мусора.

READ ALSO
Заполнение списка данными из бд SQLite

Заполнение списка данными из бд SQLite

Доброго времени суток, есть класс описывающий записи в бд:

240
Нажать на кнопку в другом приложении

Нажать на кнопку в другом приложении

Подскажите пожалуйста почему не срабатывает код, окно находит кнопку тоже, но нажатия не происходит ни WM_LBUTTONDOWN c WM_LBUTTONUP ни BM_CLICK

197
Блокировка UI несмотря на асинхронность

Блокировка UI несмотря на асинхронность

Создаю и запускаю задачу вот так:

206
Обновление UI у клиента

Обновление UI у клиента

При попадании по игроку нужно обновлять показания его здоровья на его сторонеПочему этого не происходит и как правильно это реализовать?

210