2011-08-13 9 views
9

Tak więc chciałem zobaczyć, co stanie się z podstawową aplikacją Qt4 skompilowaną z prostego pliku Makefile po uruchomieniu przez Valgrind. Co spowodowałoby te wycieki? Usuwam wszystkie dynamicznie przydzielane obiekty na moim końcu. Również po wyjściu z programu klikam tylko na zamknięcie (X) w górnym prawym rogu. Czy biblioteki GUI po prostu nie "free()" żadnej z pamięci ich malloc() "d?Valgrind na podstawowej aplikacji Qt: Raporty Masive Leaks

Makefile zmniejszona z poleceniem QMake jest:

####### Compiler, tools and options 

CXX   = g++ 
CXXFLAGS  = -pipe -O2 -Wall -W 
LIBS_INCLUDE = ${HOME} 
INCPATH  = -I$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/mkspecs/default \ 
       -I. \ 
       -I$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/include/QtCore \ 
       -I$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/include/QtGui \ 
       -I$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/include 
LINK   = g++ 
LFLAGS  = -Wl,-O1 -Wl,-rpath,$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/lib 
LIBS   = $(SUBLIBS) -L$(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/lib -lQtGui -lQtCore -lpthread 
QMAKE   = $(LIBS_INCLUDE)/QtSDK/Desktop/Qt/473/gcc/bin/qmake 
OBJECTS_DIR = ./ 
SOURCES  = main.cpp 
OBJECTS  = main.o 
QMAKE_TARGET = Main 
TARGET  = Main 

####### Build rules 
first: all 

all: $(TARGET) 

$(TARGET): $(OBJECTS) 
     $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) 

####### Compile 

main.o: main.cpp 
     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp 

Kod jedynym źródłem jest:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(320,240); 
    window.setWindowTitle( 
     QApplication::translate("toplevel", "Top-level Widget")); 
    window.show(); 

    QPushButton *button = new QPushButton(
     QApplication::translate("childwidget", "Press me"), &window); 
    button->move(100, 100); 
    button->show(); 
    delete button; 
    return app.exec(); 
} 

Kiedy uruchomić poprzez valgrind otrzymuję następujący (usunięcie dużej części, w środku):

==3836== Memcheck, a memory error detector 
==3836== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==3836== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info 
==3836== Command: ./Main 
==3836== 
Xlib: extension "RANDR" missing on display ":0.0". 
==3836== 
==3836== HEAP SUMMARY: 
==3836==  in use at exit: 924,383 bytes in 8,679 blocks 
==3836== total heap usage: 37,234 allocs, 28,555 frees, 4,314,180 bytes allocated 
==3836== 
==3836== 1 bytes in 1 blocks are possibly lost in loss record 1 of 4,534 
==3836== at 0x400677E: malloc (vg_replace_malloc.c:195) 
==3836== by 0xA1DFA4: g_malloc (in /lib/libglib-2.0.so.0.2600.0) 
==3836== by 0xA37F29: g_strdup (in /lib/libglib-2.0.so.0.2600.0) 
==3836== by 0xB2A6FA: g_param_spec_string (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0x41F36473: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== by 0xB3D237: g_type_class_ref (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB20B38: g_object_newv (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB212EF: g_object_new (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0x41F34857: gtk_settings_get_for_screen (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== by 0x41ED0CB6: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== by 0xB377C7: g_cclosure_marshal_VOID__OBJECT (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB1ABE2: g_closure_invoke (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== 
... 
==3836== 
==3836== 23,048 bytes in 1 blocks are possibly lost in loss record 4,531 of 4,534 
==3836== at 0x400677E: malloc (vg_replace_malloc.c:195) 
==3836== by 0x16F42D: ??? (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x17400B: ft_mem_qalloc (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x174063: ft_mem_alloc (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x174508: ft_mem_qrealloc (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x17457F: ft_mem_realloc (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x1A2E52: ??? (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x1A709B: ??? (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x180338: ??? (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x175B5D: ??? (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x1780B0: FT_Open_Face (in /usr/lib/libfreetype.so.6.6.0) 
==3836== by 0x1791FF: FT_New_Face (in /usr/lib/libfreetype.so.6.6.0) 
==3836== 
==3836== 53,244 bytes in 29 blocks are possibly lost in loss record 4,534 of 4,534 
==3836== at 0x400677E: malloc (vg_replace_malloc.c:195) 
==3836== by 0xA1DFA4: g_malloc (in /lib/libglib-2.0.so.0.2600.0) 
==3836== by 0xA36050: g_slice_alloc (in /lib/libglib-2.0.so.0.2600.0) 
==3836== by 0xA36315: g_slice_alloc0 (in /lib/libglib-2.0.so.0.2600.0) 
==3836== by 0xB40077: g_type_create_instance (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB1CE35: ??? (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB205C6: g_object_newv (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0xB212EF: g_object_new (in /lib/libgobject-2.0.so.0.2600.0) 
==3836== by 0x54B8FA3: ??? (in /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so) 
==3836== by 0x41F0CDDD: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== by 0x41F11C24: gtk_rc_get_style (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== by 0x4200A81F: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2200.0) 
==3836== 
==3836== LEAK SUMMARY: 
==3836== definitely lost: 1,912 bytes in 7 blocks 
==3836== indirectly lost: 5,060 bytes in 250 blocks 
==3836==  possibly lost: 491,358 bytes in 2,893 blocks 
==3836== still reachable: 426,053 bytes in 5,529 blocks 
==3836==   suppressed: 0 bytes in 0 blocks 
==3836== Reachable blocks (those to which a pointer was found) are not shown. 
==3836== To see them, rerun with: --leak-check=full --show-reachable=yes 
==3836== 
==3836== For counts of detected and suppressed errors, rerun with: -v 
==3836== ERROR SUMMARY: 1336 errors from 1336 contexts (suppressed: 114 from 11) 
+1

To trochę niepokojące. Powinieneś spróbować ponownie za pomocą -O0 i sprawdzić, czy się zmienia (czasami optymalizacje mylić valgrind) – Owen

+1

Ponieważ używasz QT z obsługą glib, spróbuj przeczytać [ten link] (http://live.gnome.org/Valgrind), który powinien pozbyć się fałszywych trafień. – vanza

+0

Dwa wycieki w glib, jeden wyciek w FreeType. Nie obwiniaj Qt, myślę, że :) – Torp

Odpowiedz

3

Skompilowałem twoją krótką aplikację i (korzystając z wizualnego detektora pamięci crle memoryleak) nie może znaleźć żadnych wycieków pamięci. Tak więc wszelkie raporty valgrind nie są bezpośrednio związane z twoim kodem.

Jednak program QPushButton usuwa się przed uruchomieniem aplikacji. Zazwyczaj własność QWindows jest przenoszona do okna nadrzędnego, więc nie musisz sam czyścić obiektów, okno macierzyste obsługuje je (jeśli tak nie jest, jest to określone w dokumentacji).

Aby skorygować kod, wystarczy usunąć usunięcie.