Утечка памяти в Valgrind сообщается в приложении QT - PullRequest
0 голосов
/ 29 сентября 2011

Я использую сериализатор в 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 ]

3 голосов
/ 29 сентября 2011

QList не несет ответственности за освобождение указателей AppNodeRecord, которые вы добавляете к нему, вы должны сделать это вручную (qDeleteAll может помочь в этом случае).

Но как обычноиз-за отсутствия веских причин используйте QList<AppNodeRecord>, чтобы избежать этой проблемы.

0 голосов
/ 30 сентября 2011

Valgrind memcheck только сообщает вам, что произошла утечка памяти.Если, как в вашем случае, он есть, он сообщает о функции, в которой произошло выделение памяти (оператор new).

Чтобы избавиться от этой утечки, вы должны удалить все элементы, которые имеютбыли динамически распределены.В вашем случае, как писал Идан К, вы можете использовать общий алгоритм Qt qDeleteAll(objAppNodeListRecord), например, в деструкторе вашего класса, или вы можете использовать более явную версию следующим образом:

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