【问题标题】:Valgrind memory leak reported in QT list appendQT 列表中报告的 Valgrind 内存泄漏追加
【发布时间】:2023-03-19 01:10:01
【问题描述】:

我在 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 的问题?

【问题讨论】:

  • 什么是“in >> tmp;”做?它是填充它指向的 AppNodeRecord 还是改变指针的值?
  • 它是一个反序列化器。它用信息填充对象。

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


【解决方案1】:

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

但是像往常一样,如果没有充分的理由,首先使用QList&lt;AppNodeRecord&gt; 来避免这种麻烦。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多