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