2011-09-29 78 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; 
}