?

Log in

wxWidgets
developers community
Утечка памяти? 
02-06-2011 17:00
Mish
Похоже, кроме меня, тут никого нет :)

Такой глупый вопрос - откуда в таком простом месте утечка памяти:

        for(vector<bmp>::iterator i = dir.begin(); i != dir.end(); ++i) // Список файлов изображений, bmp - моя структура, неважно
        {
            wxImage img(i->file);
            if (img.IsOk())
            {
                i->w = img.GetWidth();
                i->w = img.GetHeight();
            }
        }

Т.е. я просто, имея список, собираю размеры. Не очень-то эффективно (загружать весь рисунок), но как справиться иначе, особенно с разными форматами, не придумал.

Случайно, тестируя, натравил на каталог, где эти картинки лежат тысячами :( Ну, решил попробовать в экстремальных условиях. Но вскоре машина стала откровенно тормозить, а диспетчер задач показывать, что у меня этой программой съедено полтора гига памяти...

С чего бы? Или деструктора по умолчанию недостаточно? Или я что-то не так понимаю, как работает освобождение памяти? (Там не сборка мусора применяется?...)

И как корректно решить мою задачу, чтоб не влезать в такие вот неприятности?
UPD: Компилятор Open Watcom 1.9. Я тут его средствами heapwalk прошелся - новая информация к размышлению: использованная память стоит на месте, а вот свободная (но забранная программой) растет и растет... Т.е. какая-то хитрая дефрагментация, что ли?...

Comments 
03-06-2011 03:30 (UTC)
Хм... А ProcessExplorer что показывает? (мы ведь о виндах говорим?) Статистика памяти, количество открытых хендлеров - там много чего посмотреть можно.
Кстати, в C++ нет сборщика мусора.
Другим компилятором собирать пробовали?
03-06-2011 05:35 (UTC)
То же самое :) - по величине примерно совпадает с памятью, которую показывает heapwalk. Почему-то память выделяется все новая и новая, а в освободившиеся блоки ничего не пишется.

Я знаю, что сборщика мусора в C++ нет, но для конкретных классов его можно запросто написать :) - вот потому и спрашивал, нет ли какого-то аналога случайно в wxWidget, с них станется :)

Пропробовал - вызов heapshrink вроде помогает, но решение какое-то... ну, не эстетичное, что ли :) Ну и - надо четко представлять, в какой момент этот вызов использовать, а то можно нужного результата не добиться.
This page was loaded Feb 22nd 2017, 9:25 am GMT.