C # освобождает память от изображения, при присвоении ей null [duplicate]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

32
задан Ed S. 7 June 2011 в 22:39
поделиться

2 ответа

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

] Метод Dispose этого класса-оболочки должен выпустить обернутый поток, чтобы его можно было собрать мусором. После того, как BitmapImage инициализируется этим потоком обертки, поток оболочки может быть удален, освобождение базового потока и возможность освобождения большого байтового массива.

BitmapImage сохраняет ссылку на источника, поэтому он сохраняет объект MemoryStream живым. К сожалению, несмотря на то, что MemoryStream.Dispose вызывается, он не освобождает массив байтов, который обтекает поток памяти. Таким образом, в этом случае битмап ссылается на поток, который ссылается на буфер, который может занимать много места на большой куче объекта. Не существует истинной утечки памяти; когда больше нет ссылок на растровые изображения, все эти объекты будут (в конечном итоге) собираться мусором. Но поскольку bitmap уже сделал свою собственную частную копию изображения (для рендеринга), кажется довольно расточительным иметь теперь ненужную оригинальную копию растрового изображения все еще в памяти.

Кроме того, какую версию .NET вы используете? До .NET 3.5 SP1 существовала известная проблема, при которой бит-файл BitmapImage мог вызвать утечку памяти . Обходной путь состоял в том, чтобы вызвать Freeze в BitmapImage.

35
ответ дан Oppositional 27 August 2018 в 22:56
поделиться

Где вы закрываете и удаляете поток памяти? Может быть, GC должен работать намного сложнее, чтобы освободить ресурсы, переместив несколько поколений до выполнения деструкторов на объекте (которые обычно называют dispose, если вы забыли сделать это).

В вашем случае вы не можете распоряжаться потоком памяти, пока не закончите с изображением. Когда вы хотите, чтобы они были выгружены, прокрутите изображения и попробуйте избавиться от потока памяти.

2
ответ дан Dave Ferguson 27 August 2018 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: