0

我在 QT C++ 中使用序列化程序。看起来不错,但 valgrind(memcheck 工具)报告此函数存在内存泄漏。

瓦尔格林命令: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问题吗?

4

2 回答 2

3

QList不负责释放您附加到它的指针AppNodeRecord,您必须手动完成(qDeleteAll在这种情况下可能会有所帮助)。

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

于 2011-09-29T16:42:45.420 回答
0

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

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

foreach (AppNodeRecord *element, objAppNodeListRecord)
{
  delete element;
}
于 2011-09-30T12:57:04.720 回答