带有QListWidget的Memoryleak addItem()+ setItemWidget()

时间:2014-08-27 22:17:24

标签: c++ qt memory-leaks qt5

当我按下一个键时,会有一个对引擎的查询。通过添加项目和设置窗口小部件,将结果放入QListWidget。不知何故,这会导致大量内存溢出甚至崩溃我的机器。但我没有得到错误。 clear()不会删除传递给QListWidget的项目和setItemWidget()设置的小部件。我甚至试图自己删除它们(评论),但仍然有记忆漏洞。我想,错误发生在if (!results.empty()) - 块中,因为将其注释掉后会插入内存泄漏。

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 个答案:

答案 0 :(得分:1)

你绝对应该使用内存泄漏检测工具而不是猜测:)

UPDATE :clear()仅删除项目,但不删除属于它的小部件。如果删除QListWidget,则将删除小部件。

clear()会删除属于它的项目和小部件。并且你提到注释 if(!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);