Я думаю, что проблема заключается в предположении, что GC волшебным образом очистит ваши объекты. Однако, это может никогда не произойти, и вот что, я думаю, может происходить:
Растровые изображения используют неуправляемые ресурсы для хранения растровых данных, а растровые данные имеют большой размер. Таким образом, вы будете выделять крошечный блок управляемой памяти и огромный блок неуправляемой памяти для каждого растрового изображения.
Таким образом, вы оставляете свое растровое изображение без дела, чтобы сборщик мусора собирал его на досуге. Это хорошо работает для многих объектов, потому что вскоре возникает достаточное давление памяти, чтобы сборщик мусора собирал их для повторного использования памяти. Но GC смотрит на управляемую кучу и говорит: «Утилизируя неиспользуемые объекты, я могу восстановить только 64 байта памяти. Я не буду беспокоиться». Он не видит гигабайты неуправляемых ресурсов, только несколько байтов в своей куче.
Так что вам нужно отслеживать и распоряжаться растровыми изображениями самостоятельно.
Вполне возможно, что иногда вы видели, как он очищается для вас. Это происходит потому, что при определенных обстоятельствах (например, когда вы удаляете другие объекты, такие как потоки с большими объемами памяти или просто потому, что это второй день во второй половине дня), он действительно решает обработать неиспользуемые блоки памяти, а затем Ваше растровое изображение наконец-то удалено. Но вы не можете полагаться на это.
... Бродить:
В старину было две проблемы с указателями.
- Они могут быть нулевыми, что приведет к сбою кода
- Вы можете забыть освободить их память / ресурсы и получить утечки
Таким образом, в .net они переименовали «указатель» в «ссылку», добавили ГХ и сделали вид, что , что проблема больше не существует. За исключением того, что ссылки могут все еще быть нулевыми, и программистам все еще приходится отслеживать и управлять своими ресурсами, чтобы избежать утечек - только немного реже. Я думаю, что это плохо - это делает нас ленивыми и неэффективными, фактически не устраняя основную проблему, поэтому он возвращается и кусает нас, и мы заканчиваем тем, что пишем множество логики Dispose, где у нас было просто «удалить» в наших деструкторах.