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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListWidgetItem утекает память  (Прочитано 3741 раз)
NeCoder
Гость
« : Сентябрь 22, 2017, 12:57 »

Имею такой код. По диспетчеру смотрю что память утекает при каждом вызове функции. Вроде делаю всё правильно а память утекает. Если убрать заполнение листа то утечка прекращается. Что я делаю не так?

Код:
void MainWindow::show_report(QList<int> &iType, QStringList &strErr)
{
    // очищаю старые данные если такие есть
    if(ui->lstReport->count()>0)
    {
        qDebug() << "BEFORE ADD";
        qDebug() << ui->lstReport->count();

        for(int i=ui->lstReport->count()-1; i>0; i--)
        {
            QListWidgetItem *lstItem = ui->lstReport->takeItem(i);
            if(lstItem)
            {
                qDebug() << i;
                ui->lstReport->removeItemWidget(lstItem);
                delete lstItem;
            }
            else
            {
                qDebug() << "IM NOT ITEM!";
            }
        }

        ui->lstReport->clear();
    }



    // добавляю новые данные
    for(int i=0; i<iType.count(); i++)
    {
        QListWidgetItem *lstItem = new QListWidgetItem(iType[i]==1?QIcon(":/images/warning.png"):QIcon(), strErr[i], ui->lstReport);
        ui->lstReport->addItem(lstItem);
    }

    iType.clear();
    strErr.clear();

    qDebug() << "AFTER ADD";
    qDebug() << ui->lstReport->count();
}
« Последнее редактирование: Сентябрь 22, 2017, 13:21 от NeCoder » Записан
MrDron
Гость
« Ответ #1 : Сентябрь 22, 2017, 13:34 »

Судя по документации то QListWidget::clear() должен сам все удалять и без delete takeItem(i)
Цитировать
All items will be permanently deleted.
И в переборе кстати условие i >= 0
Записан
NeCoder
Гость
« Ответ #2 : Сентябрь 22, 2017, 13:59 »

Цитировать
И в переборе кстати условие i >= 0
Таки да.

Судя по документации то QListWidget::clear() должен сам все удалять и без delete takeItem(i)
Изучу.

Как выяснил - память течет из-за иконки. Если иконку загрузить в конструкторе MainWindow и потом использовать уже загруженную иконку, то утечка прекращается. Может так и задумано, я без понятия. Непонимающий
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 22, 2017, 14:38 »

А с чего вы взяли что память течёт?
Записан
dilshodm
Новичок

Offline Offline

Сообщений: 18


Просмотр профиля
« Ответ #4 : Октябрь 17, 2017, 22:01 »

Надо обратить внимание на следующий момент:

Код:
        QListWidgetItem *lstItem = new QListWidgetItem(iType[i]==1?QIcon(":/images/warning.png"):QIcon(), strErr[i], ui->lstReport);
        ui->lstReport->addItem(lstItem);


получается, что во время создания lstItem он уже вставляется в ui->lstReport, а затем еще раз вставляется с помощью команды addItem(lstItem).
как сказано в доке, повторное добавление уже существующего QListWidgetItem приводит к неопределенному поведению:
Цитировать
Warning: A QListWidgetItem can only be added to a QListWidget once. Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.

Поэтому лучше создавать с родителем по умолчанию:

Код:
        QListWidgetItem *lstItem = new QListWidgetItem(iType[i]==1?QIcon(":/images/warning.png"):QIcon(), strErr[i]);
        ui->lstReport->addItem(lstItem);

Записан

С уважением,
Dilshod
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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