Утечка памяти Valgrind сообщается в добавлении списка QT

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

Вывод Валгринд:

==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)

Может дело в валгринде?


person Juan E. Delgado    schedule 29.09.2011    source источник
comment
что делает в ›› tmp; делать? Заполняет ли он AppNodeRecord, на который указывает, или изменяет значение указателя?   -  person Grissiom    schedule 29.09.2011
comment
Это десериализатор. Он наполняет объект информацией.   -  person Juan E. Delgado    schedule 30.09.2011


Ответы (2)


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

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

person Idan K    schedule 29.09.2011

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

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

foreach (AppNodeRecord *element, objAppNodeListRecord)
{
  delete element;
}
person Lohrun    schedule 30.09.2011