Возможная утечка памяти в System.Drawing.Bitmap Zxing - PullRequest
4 голосов
/ 08 августа 2011

Я сейчас работаю с 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

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

1 Ответ

4 голосов
/ 08 августа 2011

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

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

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

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

...