2009-10-20 6 views
16

Tôi đang cố gắng gỡ lỗi một ứng dụng xây dựng lớn bằng cách sử dụng Qt/C++ và valgrind đang báo cáo rất nhiều rò rỉ bộ nhớ từ nội dung Qt. Có ai có thể chia sẻ tệp nén valgrind thích hợp cho các ứng dụng Qt không?Có ai đang sử dụng valgrind và Qt không?

Cảm ơn!

Ví dụ:

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

lợi nhuận:

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

Trả lời

5

--show-reachable hiển thị bộ nhớ chưa thực sự bị rò rỉ, mặc dù valgrind gọi đó là bản ghi tổn thất. Ứng dụng thử nghiệm của bạn không bị rò rỉ bất kỳ bộ nhớ nào.

Bạn không cần bất kỳ biện pháp ngăn chặn valgrind nào cho trường hợp cụ thể này. Đối với những người khác, có thể, nhưng bạn nên sử dụng tùy chọn --gen-suppressions của valgrind để tạo ra những áp lực cho bạn.

1

Nhật ký valgrind trên báo cáo 0 rò rỉ, ví dụ: có không có lỗi.

3
still reachable: 744 bytes in 7 blocks 

Nếu bạn phát hành QObject o? Bạn vẫn có kết quả tương tự?

Cập nhật: Chỉ cần làm rõ, bộ nhớ này sẽ được hệ điều hành phát hành khi bạn đóng ứng dụng (vì vậy nó không bị rò rỉ).

Tuy nhiên, vì lợi ích của riêng bạn, nên viết một trình phá hủy để giải phóng bộ nhớ và luôn cảm thấy dễ chịu khi biết rằng bạn có quyền kiểm soát những gì được phân bổ và giải quyết. (vì vậy bạn không kết thúc với rò rỉ bộ nhớ thực ...)

+0

Hãy bình luận nếu bạn downvote .... Tôi không thấy bất kỳ vấn đề với người dùng nên phát hành bộ nhớ họ phân bổ (ngay cả khi nó được ẩn dưới một đoạn lớn của qt) – Johan

+0

+ 1'd :) : Tôi thấy rằng đó là thông tin giá trị, cá nhân. – zeboidlund