Russian Qt Forum
Ноябрь 24, 2024, 19:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти QImage: out of memory, returning null image  (Прочитано 3992 раз)
randir
Гость
« : Июнь 09, 2016, 12:12 »

Всем привет. Сразу скажу я не программист и тем более не программировал на QT (имею только поверхностные знания)
Но так случилось что приходится разбираться с чужим кодом. В приложении работает слайдер и через какое то время выскакивает ошибка. Понятно что это из-за утечки памяти происходит, но не понятно как это исправить
Вот часть кода отвечающая за слайдер. Может кто сможет подсказать как исправить утечку.
Был бы крайне благодарен.
Код:
  //загрузим все слайды
    QDir dir("./slides");
    slides=dir.entryList(QDir::Files,QDir::Name);
    for(int i=0;i<slides.size();i++)
    {
        slides[i]="file:///"+dir.absoluteFilePath(slides[i]);
    }

    offDelay = OFF_INTERVAL;
    checkDowncount = 0;

    slideDowncount = SLIDE_INTERVAL;
    currSlide = 0;
    if(slides.size()) view->load(QUrl(slides[currSlide]));
    else view->load(QUrl(""));

    //взведем секундный таймер
    connect(&tm, SIGNAL(timeout()), this, SLOT(slot_tm()));
    tm.setInterval(1000);
    tm.start();

    get_in_progress=false;
    very_ok=false;
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июнь 09, 2016, 12:57 »

А с чего вы решили, что проблема с утечкой?

В указанном куске кода добавьте в каждую строку логирование: qDebug() << 1; qDebug() << 2; и т.п.
И смотрите какой лог не появился в консоли при падении программы, так вы узнаете в какой строке падает.

Плюс, можно запустить под отладчиком.

Удобнее всего вам будет запускать в IDE -- в ней консоль всегда есть.



Еще вы сказали, что падает через некоторое время, а в указанном коде вы только задаете список картинок и запускаете таймер, который похоже и переключает их, поэтому проблема должна возникнуть в методе: slot_tm().

Непонятно также какого типа переменная view



Загружаемые картинки какого размера?
Какая версия Qt?
« Последнее редактирование: Июнь 09, 2016, 13:01 от gil9red » Записан

randir
Гость
« Ответ #2 : Июнь 09, 2016, 13:02 »

В диспетчере задач увидел что память постепенно забивается. Ну и в режиме отладки ошибка выскакивает.
Размеры картинок разные.. пробовал маленькие грузить но это проблемы не решает, просто дольше чуть память забивается.
Версия QT на котором собиралось 5.3.1
Приложение использует Qtwebkit и я так понимаю в 5.6 уже вебкита нет. Пробую сейчас 5.5.1

Я пробывал таймер убирать. но все равно память постепенно накапливается.. Помогало только если вообще ни каких картинок в папке нет.. тогда ничего не копится.
« Последнее редактирование: Июнь 09, 2016, 13:07 от randir » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июнь 09, 2016, 13:14 »

Еще вы сказали, что падает через некоторое время, а в указанном коде вы только задаете список картинок и запускаете таймер, который похоже и переключает их, поэтому проблема должна возникнуть в методе: slot_tm().

Непонятно также какого типа переменная view
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 09, 2016, 13:19 »

Похоже на утечку, но не в приведенном месте. Возможно где-то view пере-создается, но не удаляется. Хорошее средство - использовать QImage (вместо QImage *) для типа view
Записан
randir
Гость
« Ответ #5 : Июнь 09, 2016, 13:25 »

Всем спасибо. Но вроде нашел решение. До этого собирал сборку на 5.3.1
Сейчас поставил 5.5.1
Вроде теперь утечек нет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.19 секунд. Запросов: 23.