Lorsque j'appuie sur une touche, une requête doit être envoyée à un moteur. Les résultats sont placés dans un QListWidget
en ajoutant un élément et en définissant le widget. D'une certaine manière, cela provoque un débordement de mémoire massif et même écrasé ma machine. Mais je ne comprends pas l'erreur. Est-ce que clear()
ne supprime pas les éléments transmis au QListWidget
et les widgets définis par setItemWidget()
. J'ai même essayé de les supprimer moi-même (commentaire), mais j'ai quand même eu une faille mémoire. L'erreur est dans le if (!results.empty())
-bloc, je suppose, puisque le commentaire sur le plugin se branche sur le memoryleak.MemoryLeak avec 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();
}
Je viens essayé. Le memoryleak persiste. Valgrind me dit qu'il n'y a pas d'erreur. – ManuelSchneid3r
@ ManuelSchneid3r, qu'en est-il de commenter la partie QLabel et setItemWidget, ne laissant que les deux premières lignes (new QListWidgetItem et addItem). Et quelle est la chose qui vous dit qu'il y a une fuite de mémoire? Le programme se bloque? – fxam
Trouvé: clear() ne supprime pas les widgets. Cela supprime simplement les widgets. Merci pour votre aide, – ManuelSchneid3r