2011-09-29 3 views
0

QT C++에서 직렬기를 사용하고 있습니다. 괜찮아 보이지만 valgrind (memcheck 도구)가이 함수에서 메모리 누수를보고하고 있습니다.QT 목록에 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의 문제가 될 수 있을까요?

+0

>>에서 "TMP를 무엇; " 해야 할 것? 포인터가 가리키는 AppNodeRecord를 채우거나 포인터의 값을 변경합니까? – Grissiom

+0

디시리얼라이저입니다. 객체를 정보로 채 웁니다. –

답변

3

QList은 추가 포인터 AppNodeRecord을 할당 해제 할 책임이 없으므로 수동으로 수행해야합니다 (qDeleteAll).

그러나 평소처럼 좋은 이유가 없기 때문에 먼저이 번거 로움을 피하려면 QList<AppNodeRecord>을 사용하십시오.

0

Valgrind memcheck는 메모리 누수가 있음을 알려줍니다. 귀하의 경우와 같이 하나가있는 경우 메모리 할당이 발생한 곳의 기능을보고합니다 (new 성명).

이 누출을 제거하려면 동적으로 할당 된 모든 요소를 ​​삭제해야합니다. 귀하의 경우, Idan K가 쓴, 당신은 당신의 클래스의 소멸자 예를 들어 일반 Qt는 알고리즘 qDeleteAll(objAppNodeListRecord)를 사용하거나 다음과 같은 좀 더 명시 적 버전을 사용할 수 있습니다 :

foreach (AppNodeRecord *element, objAppNodeListRecord) 
{ 
    delete element; 
} 
관련 문제