Russian Qt Forum

Qt => Вопросы новичков => Тема начата: randir от Июнь 09, 2016, 12:12



Название: Утечка памяти QImage: out of memory, returning null image
Отправлено: 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;


Название: Re: Утечка памяти QImage: out of memory, returning null image
Отправлено: gil9red от Июнь 09, 2016, 12:57
А с чего вы решили, что проблема с утечкой?

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

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

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



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

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



Загружаемые картинки какого размера?
Какая версия Qt?


Название: Re: Утечка памяти QImage: out of memory, returning null image
Отправлено: randir от Июнь 09, 2016, 13:02
В диспетчере задач увидел что память постепенно забивается. Ну и в режиме отладки ошибка выскакивает.
Размеры картинок разные.. пробовал маленькие грузить но это проблемы не решает, просто дольше чуть память забивается.
Версия QT на котором собиралось 5.3.1
Приложение использует Qtwebkit и я так понимаю в 5.6 уже вебкита нет. Пробую сейчас 5.5.1

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


Название: Re: Утечка памяти QImage: out of memory, returning null image
Отправлено: gil9red от Июнь 09, 2016, 13:14
Еще вы сказали, что падает через некоторое время, а в указанном коде вы только задаете список картинок и запускаете таймер, который похоже и переключает их, поэтому проблема должна возникнуть в методе: slot_tm().

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


Название: Re: Утечка памяти QImage: out of memory, returning null image
Отправлено: Igors от Июнь 09, 2016, 13:19
Похоже на утечку, но не в приведенном месте. Возможно где-то view пере-создается, но не удаляется. Хорошее средство - использовать QImage (вместо QImage *) для типа view


Название: Re: Утечка памяти QImage: out of memory, returning null image
Отправлено: randir от Июнь 09, 2016, 13:25
Всем спасибо. Но вроде нашел решение. До этого собирал сборку на 5.3.1
Сейчас поставил 5.5.1
Вроде теперь утечек нет.