Я пишу программу (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, который освобождается.
wait, *** один *** изображение 100 мб ?? – UmNyobe
Да, изображения представляют собой несжатые TIFF с высоким разрешением. – mystiscool
вы можете предоставить минимальный код или, по крайней мере, часть, которая выдает исключение? Как вы читаете и отпускаете буферы изображений? – UmNyobe