Утечки памяти в C ++ в Windows 7

0

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

Если я запускаю его на большом наборе изображений, он запускается некоторое время, и, в конечном итоге, 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
    подожди, одно изображение 100 мб ??
  • 0
    Да, изображения представляют собой несжатый формат TIFF с высоким разрешением.
Показать ещё 9 комментариев
Теги:
opencv
memory-leaks
mingw

1 ответ

0

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

img.image = fi2cv(bitmap);

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

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

  • 0
    Эта функция использует только объекты cv :: Mat и не выделяет никакой памяти, так что это не должно быть проблемой. Тем не менее, мой вопрос не в том, почему происходит утечка памяти (я знаю, что это так), а в том, почему поведение, вызванное нехваткой памяти моей программы, похоже, сохраняется до перезагрузки Windows.
  • 0
    Вероятно, в библиотеке, которую вы используете, есть элемент времени выполнения. Вы можете увидеть его и завершить задачу, используя проводник задач Windows или SysInternals Process Explorer.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню