2014-08-27 58 views
0

當我按下鍵時,應該有一個查詢引擎。通過添加項目並設置小部件,將結果放入QListWidget。不知何故,這會導致大量內存溢出,甚至導致我的機器崩潰。但我沒有得到錯誤。 clear()不會刪除傳遞給QListWidget的項目和setItemWidget()設置的小部件。我甚至試圖自己刪除它們(評論),但仍然存在內存泄漏。這個錯誤出現在if (!results.empty()) -block中,我想,因爲註釋掉了內存泄漏。Memoryleak with 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(); 

} 

回答

1

你絕對應該使用一個內存泄漏檢測工具,而不是猜測圍繞:)

UPDATE:明確()只刪除的項目,但不會刪除屬於它的小部件。如果QListWidget被刪除,這些小部件將被刪除。

clear()刪除屬於它的項目和小部件。如果(!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); 

+0

我剛剛試了一下。內存泄漏仍然存在。 Valgrind告訴我沒有錯誤。 – ManuelSchneid3r 2014-08-28 10:58:02

+0

@ ManuelSchneid3r,如何評論QLabel和setItemWidget部分,只留下前兩行(新的QListWidgetItem和addItem)。有什麼事情告訴你存在內存泄漏?該程序崩潰? – fxam 2014-08-29 02:04:57

+0

發現它:clear()不會刪除小部件。它只是刪除小部件。感謝您的幫助, – ManuelSchneid3r 2014-09-01 22:21:44