我在 QT C++ 中使用序列化器。看起来没问题,但 valgrind(内存检查工具)报告此函数存在内存泄漏。
Valgrind 命令: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 的问题?
最佳答案
QList
不负责重新分配 AppNodeRecord
您附加到它的指针,您必须手动执行( qDeleteAll
在这种情况下可能会有所帮助)。
但像往常一样,由于缺乏充分的理由,请使用 QList<AppNodeRecord>
以首先避免这种麻烦。
关于c++ - QT 列表追加中报告的 Valgrind 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7600303/