2009-10-20 15 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

関連する問題