Возможная утечка памяти в Zxing System.Drawing.Bitmap

В настоящее время я работаю с Monotouch. У меня есть приложение, которое открывает камеру, а затем должно обработать изображение, которое в данный момент захвачено. Я использую код, очень похожий на https://github.com/reinforce-lab/com.ReinforceLab.MonoTouch.Controls/tree/master/VideoCaptureSample/

Разница в интересе между моим кодом и их кодом заключается в том, что в OverlayView.cs, который помещается поверх моего UIImagePickerController, у меня есть следующий код:

using (var screenImage = CGImage.ScreenImage.WithImageInRect(Frame))
{
    _imageView = UIImage.FromImage(screenImage);
    Bitmap srcbitmap = new System.Drawing.Bitmap(_imageView);
}

Однако запуск этого кода приведет к постоянному заполнению памяти до закрытия приложения. Кажется, что System.Drawing.Bitmap никогда не удаляется. Я использую ZXing.monotouch, поэтому мне нужно растровое изображение, чтобы я мог создать байты [] растрового изображения для передачи в RGBLuminanceSource.

Любые идеи о том, как я могу заставить это играть красиво?


person Symmetry    schedule 08.08.2011    source источник


Ответы (1)


Если вы используете код из [1], то он выглядит довольно неполным. Ничто не освобождает память, выделенную из AllocHGlobal, что может привести к нехватке памяти.

Это не ошибка MonoTouch — код zxing должен реализовывать IDisposable в классе Bitmap и гарантировать, что все освобождается при удалении (или когда GC запускает финализатор).

Вы можете либо завершить класс (т.е. реализовать IDisposable), либо скопировать/вставить часть, которая предоставляет вам буфер byte[], содержащий изображение (и освободить неуправляемую память после ее копирования в управляемый буфер).

[1] https://github.com/JohnACarruthers/zxing.MonoTouch/blob/master/Bitmap.cs

person poupou    schedule 08.08.2011
comment
Спасибо, глупый я, я думал, что System.Drawing.Bitmap был частью Mono, а не частью ZXing ... Я исправлю это и отмечу это как ответ, как только он заработает :) - person Symmetry; 08.08.2011
comment
Я также постараюсь объединить эти изменения с репозиторием ZXing.monotouch github, чтобы в будущем у нас больше не было таких проблем :) - person Symmetry; 08.08.2011