2009-10-20 1 views
16

Qt/C++를 사용하여 대형 응용 프로그램을 디버깅하려고하는데 valgrind가 내부 Qt 관련 내용에서 많은 메모리 누수를보고하고 있습니다. 누구나 Qt 앱에 적절한 valgrind 억제 파일을 공유 할 수 있습니까?valgrind 및 Qt를 사용하는 사람이 있습니까?

감사합니다.

예 :

#include <qobject.h> 
int main() 
{ 
    QObject o; 
    return 0; 
} 

반환 :

 
$ valgrind --leak-check=full --show-reachable=yes ./leak 
==12655== Memcheck, a memory error detector 
==12655== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==12655== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info 
==12655== Command: ./leak 
==12655== 
==12655== 
==12655== HEAP SUMMARY: 
==12655==  in use at exit: 744 bytes in 7 blocks 
==12655== total heap usage: 28 allocs, 21 frees, 1,640 bytes allocated 
==12655== 
==12655== 16 bytes in 1 blocks are still reachable in loss record 1 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x6203124: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 96 bytes in 1 blocks are still reachable in loss record 2 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x62030FC: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 96 bytes in 1 blocks are still reachable in loss record 3 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x62041CD: QWaitCondition::QWaitCondition() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200EAF: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62010A0: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 4 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200DC8: QThreadData::QThreadData(int) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x620310C: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 5 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200DE9: QThreadData::QThreadData(int) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x620310C: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 6 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200E77: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62010A0: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 176 bytes in 1 blocks are still reachable in loss record 7 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x6201092: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== LEAK SUMMARY: 
==12655== definitely lost: 0 bytes in 0 blocks 
==12655== indirectly lost: 0 bytes in 0 blocks 
==12655==  possibly lost: 0 bytes in 0 blocks 
==12655== still reachable: 744 bytes in 7 blocks 
==12655==   suppressed: 0 bytes in 0 blocks 
==12655== 
==12655== For counts of detected and suppressed errors, rerun with: -v 
==12655== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 8) 

답변

5

--show-reachable은 valgrind가 손실 레코드라고해도 실제로 유출되지 않은 메모리를 보여줍니다. 테스트 응용 프로그램에서 메모리가 누출되지 않습니다.

이 특별한 경우에는 valgrind 억제가 필요하지 않습니다. 다른 사람들을 위해 아마도 valgrind의 --gen-suppressions 옵션을 사용하여 이러한 억압을 생성해야합니다.

1

위 Valgrind의 로그, 즉 0 누수를보고는 오류가 없습니다.

3
still reachable: 744 bytes in 7 blocks 

QObject를 해제하면 o? 여전히 동일한 결과가 있습니까?

업데이트 :이 메모리는 응용 프로그램을 닫을 때 os에 의해 릴리스됩니다 (누수가 아님).

그러나 자신을 위해서 항상 메모리를 해제하는 소멸자를 작성하는 것이 좋으며 할당 및 할당 해제에 대한 제어권을 가지고 있음을 알면 언제나 기분이 좋습니다. (실제 메모리 누수로 끝나지 않습니다.)

+0

downvote 경우 자유롭게 의견을 말하라. 나는 사용자가 할당 한 메모리를 해제해야한다고하는 어떤 문제도 보지 못한다. (qt의 큰 덩어리 아래에 숨겨져 있어도) – Johan

+0

+ 1 :) : 저는 그것이 개인적으로 가치있는 정보라는 것을 알았습니다. – zeboidlund