2014-01-28 3 views
0

Я пишу программу (C++, MinGW 32 бит) для пакетной обработки изображений с использованием функций OpenCV, используя AngelScript в качестве языка сценариев. На данный момент у моего программного обеспечения есть некоторые утечки памяти, которые складываются довольно быстро (изображения 100-200 МБ каждый, и я обрабатываю тысячи одновременно), но я сталкиваюсь с изображением, где Windows не кажется освободите память, используемую моей программой, до перезагрузки.C++ утечки памяти в Windows 7

Если я запускаю его на большом наборе изображений, он запускается некоторое время, и, в конечном итоге, OpenCV выдает исключение, говорящее, что он вышел из памяти. В этот момент я закрываю программу, и физический счетчик задач диспетчера возвращается к тому, где он был, прежде чем я начал. Но вот уловка - каждый раз, когда я пытаюсь запустить программу еще раз, она не сработает с места в карьер, чтобы выделить память OpenCV, пока я не перезагружу компьютер, и в этот момент он будет работать просто отлично для нескольких сотен изображений.

Есть ли способ Windows, который может держаться за эту память? Или есть еще одна причина, по которой Windows не сможет выделить память моей программе до перезагрузки? Для меня это не имеет смысла.

EDIT: Компьютер, на котором я запускаю эту программу, - это 64-разрядная версия Windows 7 с 32 ГБ оперативной памяти, поэтому даже при проблемах с памятью моей программы она использует только небольшое количество доступной памяти. Обычно программа выходит за пределы чуть более 1 ГБ оперативной памяти, прежде чем она уйдет.

EDIT 2: Я также использую FreeImage для загрузки изображений, я забыл упомянуть об этом. Вот основа моего кода обработки:

//load bitmap with FreeImage 
FIBITMAP *bitmap = NULL; 
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; 
fif = FreeImage_GetFileType(filename.c_str(), 0); 
bitmap = FreeImage_Load(fif, filename.c_str(), 0); 
if (!bitmap) { 
    LogString("ScriptEngine: input file is not readable."); 
    processingFile = false; 
    return false; 
} 
//convert FreeImage bitmap to my custom wrapper for OpenCV::Mat 
ScriptImage img; 
img.image = fi2cv(bitmap); 
FreeImage_Unload(bitmap); 

try { 
    //this executes the AngelScript code 
    r = ctx->Execute(); 
} catch(std::exception e) { 
    std::cout << "Exception in " << __FILE__ << ", line " << __LINE__ << ", " << __FUNCTION__ << ": " << e.what() << std::endl; 
} 

try { 
    engine->GarbageCollect(asGC_FULL_CYCLE | asGC_DESTROY_GARBAGE); 
} catch (std::exception e) { 
    std::cout << "Exception in " << __FILE__ << ", line " << __LINE__ << ", " << __FUNCTION__ << ": " << e.what() << std::endl; 
} 

Как вы можете видеть, только указатель на FIBITMAP, который освобождается.

+1

wait, *** один *** изображение 100 мб ?? – UmNyobe

+0

Да, изображения представляют собой несжатые TIFF с высоким разрешением. – mystiscool

+1

вы можете предоставить минимальный код или, по крайней мере, часть, которая выдает исключение? Как вы читаете и отпускаете буферы изображений? – UmNyobe

ответ

0

Весьма вероятно, что вы делаете копию данных изображения на этой линии:

img.image = fi2cv(bitmap); 

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

Проверьте, есть ли релиз ресурса для объектов ScriptImage.

+0

Эта функция использует только объекты cv :: Mat и не выделяет никакой памяти, поэтому это не должно быть проблемой. Однако мой вопрос заключается не в том, что происходит утечка памяти (я знаю, что это так), но почему поведение, вызванное нехваткой памяти моей программы, похоже, сохраняется до тех пор, пока я не перезагружу Windows. – mystiscool

+0

В библиотеке, которая вы используете, есть элемент времени выполнения. Возможно, вы сможете увидеть его и завершить задачу с помощью Windows task explorer или SysInternals Process Explorer. – Lother

+0

Что вы подразумеваете под "runtime element"? Если вы имеете в виду, что одна из библиотек запускает другой процесс, я не думаю, что это очень вероятно. – mystiscool

Смежные вопросы