2011-09-29 79 views
0

我在QT C++中使用了一個序列化程序。它看起來不錯,但valgrind(memcheck工具)報告此函數的內存泄漏。在QT列表中報告的Valgrind內存泄漏追加

Valgrind的CMD:valgrind --tool=memcheck --leak-check=full

QDataStream &operator>>(QDataStream &in, QList<AppNodeRecord *> *objAppNodeListRecord) 
{ 
    quint32 len; 
    in >> len; 

    objAppNodeListRecord->clear(); 
    for(quint32 i = 0; i < len; ++i) 
    { 
     AppNodeRecord *tmp=new AppNodeRecord; 
     in >> tmp; 
     objAppNodeListRecord->append(tmp); 

     if (in.atEnd()) 
      break; 
    } 
    return in; 
} 

Valgrind的報告說,這種情況下不被釋放,但它是在QList作中使用。

AppNodeRecord *tmp=new AppNodeRecord; 

Valgrind的輸出:

==19503== 1,445 (68 direct, 1,377 indirect) bytes in 1 blocks are definitely lost in loss record 1,540 of 1,568 
==19503== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255) 
==19503== by 0x8058562: operator>>(QDataStream&, QList<AppNodeRecord*>*) (zbDbs_NodeMgmt.cpp:206) 
==19503== by 0x804D53C: main (main.cpp:53) 

難道是一個Valgrind的問題?

+0

什麼是「在TMP >>; 「做?它是否填充它指向的AppNodeRecord或更改指針的值? – Grissiom

+0

這是一個解串器。它用信息填充對象。 –

回答

3

QList不負責釋放您附加到它的指針AppNodeRecord,您必須手動執行(qDeleteAll可能會幫助在這種情況下)。

但像往常一樣,由於缺乏一個很好的理由,首先使用QList<AppNodeRecord>來避免這種麻煩。

0

Valgrind memcheck只會告訴您存在內存泄漏。如果,就像你的情況一樣,它會報告發生內存分配的函數(new語句)。

要擺脫此泄漏,您必須刪除所有已動態分配的元素。在你的情況下,作爲伊詹ķ寫道,你可以在你的類的析構函數使用通用的Qt算法qDeleteAll(objAppNodeListRecord)例如,或者你可以使用一個更明確的版本如下:

foreach (AppNodeRecord *element, objAppNodeListRecord) 
{ 
    delete element; 
}