2009-10-20 3 views
16

J'essaye de déboguer une grande construction d'application en utilisant Qt/C++ et valgrind rapporte beaucoup de fuites de mémoire à partir de Qt interne. Quelqu'un pourrait-il partager un bon fichier de suppression valgrind pour les applications Qt?Est-ce que quelqu'un utilise valgrind et Qt?

Merci!

Par exemple.

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

retours:

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

Répondre

5

- show-reachable montre la mémoire qui n'a pas réellement fui, même si valgrind l'appelle un enregistrement de perte. Votre application de test ne fuit aucune mémoire.

Vous n'avez pas besoin de suppression de valgrind pour ce cas particulier. Pour d'autres, peut-être, mais vous devriez utiliser l'option --gen-suppressions de valgrind pour générer ces suppressions pour vous.

1

Le journal valgrind rapports ci-dessus 0 fuites, à savoir il sont aucune erreur.

3
still reachable: 744 bytes in 7 blocks 

Si vous publiez QObject o? Avez-vous toujours le même résultat?

Mise à jour: Juste pour clarifier, cette mémoire sera libérée par l'os lorsque vous fermerez l'application (donc ce n'est pas une fuite).

Toutefois, pour votre propre plaisir, il est toujours bon d'écrire un destructeur qui libère la mémoire, et il est toujours agréable de savoir que vous avez le contrôle sur ce qui est alloué et désalloué. (donc vous ne vous retrouvez pas avec de véritables fuites de mémoire ...)

+0

N'hésitez pas à commenter si vous downvote .... Je ne vois pas de problème avec les utilisateurs qui devraient libérer la mémoire qu'ils allouent (même si elle est cachée sous un gros morceau de qt) – Johan

+0

+ 1d :) : J'ai trouvé que c'était une information précieuse, personnellement. – zeboidlund

Questions connexes