QT列表中报告的Valgrind内存泄漏附加

时间:2011-09-29 16:17:33

标签: c++ qt memory-leaks valgrind qlist

我在QT C ++中使用串行器。它看起来不错,但是valgrind(memcheck工具)正在报告此函数的内存泄漏。

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问题吗?

2 个答案:

答案 0 :(得分:3)

QList不负责取消分配您附加到它的AppNodeRecord指针,您必须手动执行(qDeleteAll可能会有帮助)。

但像往常一样,由于缺乏充分的理由,首先使用QList<AppNodeRecord>来避免这种麻烦。

答案 1 :(得分:0)

Valgrind memcheck只告诉你内存泄漏。如果在您的情况下有一个,它会报告发生内存分配的函数(new语句)。

要消除此泄漏,您必须删除已动态分配的所有元素。在你的情况下,正如Idan K写的那样,你可以在你的类的析构函数中使用通用的Qt算法qDeleteAll(objAppNodeListRecord),或者你可以使用更明确的版本,如下所示:

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