Когда я нажимаю клавишу, должен появиться запрос к движку. Результаты будут помещены в 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();
}
Я просто попробовал. Память сохраняется. Вальгринд говорит мне, что ошибок нет. – ManuelSchneid3r
@ ManuelSchneid3r, как насчет комментирования части QLabel и setItemWidget, оставляя только первые две строки (новый QListWidgetItem и addItem). И что это значит, что есть утечка памяти? Сбой программы? – fxam
Нашел: clear() не удаляет виджеты. Он просто удаляет виджеты. Спасибо за вашу помощь, – ManuelSchneid3r