Подтвердить что ты не робот

Кто-нибудь использует valgrind и Qt?

Я пытаюсь отлаживать большую сборку приложения с помощью Qt/С++, и valgrind сообщает о большой утечке памяти из внутреннего Qt-материала. Может ли кто-нибудь поделиться соответствующим файлом подавления valgrind для приложений Qt?

Спасибо!

Eg.

#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)
4b9b3361

Ответ 1

- show-достижимая показывает память, которая фактически не просочилась, хотя valgrind называет ее записью потерь. Ваше тестовое приложение не теряет никакой памяти.

Вам не нужны никакие преграды valgrind для этого конкретного случая. Для других, может быть, но вы должны использовать опцию valgrind --gen-suppressionions для генерации этих подавлений для вас.

Ответ 2

still reachable: 744 bytes in 7 blocks

Если вы выпустили QObject o? По-прежнему имеют тот же результат?

Обновление. Чтобы уточнить, эта память будет выпущена os при закрытии приложения (так что это не утечка).

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

Ответ 3

В приведенном выше журнале valgrind сообщается о 0 утечках, то есть ошибок нет.