2014-08-27 4 views
0

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

} 

Répondre

1

Vous devez absolument utiliser un outil de détection de fuite de mémoire au lieu de deviner autour :)

MISE À JOUR: clear() supprime uniquement les éléments mais ne supprime pas les widgets qui lui appartiennent. Les widgets seront supprimés si le QListWidget est supprimé. Clear() supprime les éléments et les widgets qui lui appartiennent.

Et vous avez mentionné que commentant si (! Results.empty()) a résolu le problème. Je ne vois aucun problème dans la partie setItemWidget. Donc, je pense que le problème se situe ailleurs, peut-être ListItemWidget. Que diriez-vous essayer de remplacer ListItemWidget par QLabel et voir ce qui se passe. Par exemple:

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

+0

Je viens essayé. Le memoryleak persiste. Valgrind me dit qu'il n'y a pas d'erreur. – ManuelSchneid3r

+0

@ 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

+0

Trouvé: clear() ne supprime pas les widgets. Cela supprime simplement les widgets. Merci pour votre aide, – ManuelSchneid3r

Questions connexes