Memoryleak with QListWidget addItem() + setItemWidget()



当我按下一个键时,会有一个对引擎的查询。通过添加一个项目并设置小部件,将结果放入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();
}

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

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

clear()确实删除了属于它的项和小部件。您提到注释掉if(!results.empty())解决了这个问题。我认为setItemWidget部分没有任何问题。所以我认为问题出在其他地方,也许是ListItemWidget。不如试着用QLabel替换ListItemWidget,看看会发生什么。例如:

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);

相关内容

  • 没有找到相关文章

最新更新