2014-08-27 2 views
0

Когда я нажимаю клавишу, должен появиться запрос к движку. Результаты будут помещены в QListWidget, добавив элемент и установив виджет. Так или иначе, это приводит к массивному переполнению памяти и даже разбивает мою машину. Но я не получаю ошибку. Does clear() не удаляет элементы, переданные на QListWidget и виджетыми, установленными setItemWidget(). Я даже пытался удалить их самостоятельно (комментарий), но все равно получил память. Ошибка в if (!results.empty()) -блоке, я думаю, так как комментирование это затыкает память.Memoryleak с QListWidget addItem() + setItemWidget()

void Widget::onTextEdited(const QString & text) 
{ 
    // QListWidgetItem * takenItem; 
    // while (takenItem = _results->takeItem(0)){ 
    //  delete _results->itemWidget(takenItem); 
    //  delete takenItem; 
    // } 
    _results->clear(); _results->hide(); 

    if (!text.isEmpty()) 
    { 
     const std::vector<const Items::AbstractItem *> results = _engine.request(text); 
     if (!results.empty()) 
     { 
      for (auto i : results){ 
       QListWidgetItem *lwi = new QListWidgetItem; 
       _results->addItem(lwi); 
       ListItemWidget *w = new ListItemWidget; 
       w->setName(i->name()); 
       w->setTooltip(i->path()); 
       _results->setItemWidget(lwi, w); 
      } 
      _results->setFixedHeight(std::min(5,_results->count()) * 48); // TODO 
      _results->show(); 
     } 
    } 
    this->adjustSize(); 

} 

ответ

1

Вы определенно должны использовать средства обнаружения утечек памяти, вместо того, чтобы гадать вокруг :)

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

clear() удаляет элементы и виджеты, принадлежащие ему. И вы упомянули, что комментируете , если (! Results.empty()) решил проблему. Я не вижу никаких проблем в части setItemWidget. Поэтому я думаю, что проблема лежит где-то в другом месте, возможно, ListItemWidget. Как насчет того, чтобы попробовать заменить ListItemWidget на QLabel и посмотреть, что произойдет. Например:

QListWidgetItem *lwi = new QListWidgetItem; 
_results->addItem(lwi); 
//ListItemWidget *w = new ListItemWidget; 
//w->setName(i->name()); 
//w->setTooltip(i->path()); 
QLabel *w = new QLabel; 
w->setText("Hello"); 
_results->setItemWidget(lwi, w); 

+0

Я просто попробовал. Память сохраняется. Вальгринд говорит мне, что ошибок нет. – ManuelSchneid3r

+0

@ ManuelSchneid3r, как насчет комментирования части QLabel и setItemWidget, оставляя только первые две строки (новый QListWidgetItem и addItem). И что это значит, что есть утечка памяти? Сбой программы? – fxam

+0

Нашел: clear() не удаляет виджеты. Он просто удаляет виджеты. Спасибо за вашу помощь, – ManuelSchneid3r

Смежные вопросы