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