2011-08-13 9 views
9

Así que quería ver qué pasaría con una aplicación Qt4 básica compilada a partir de un simple archivo Makefile cuando se ejecuta a través de Valgrind. ¿Qué estaría causando estas filtraciones? Estoy eliminando cualquier objeto dinámicamente asignado en mi extremo. Además, cuando salgo del programa, solo hago clic en el cierre (X) en la esquina superior derecha. ¿Las librerías GUI simplemente no "libre()" cualquiera de la memoria que malloc() 'd?Valgrind en la aplicación básica de Qt: informes Masive Leaks

El Makefile reducido de qmake comando es:

####### 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 

El único código fuente es:

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(); 
} 

Cuando se ejecuta a través valgrind me sale el siguiente (Porción grande retiró en el medio):

==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

Eso es algo preocupante. Debería intentar de nuevo con -O0 y ver si cambia (a veces las optimizaciones confunden valgrind) – Owen

+1

Dado que está utilizando QT con soporte glib, intente leer [este enlace] (http://live.gnome.org/Valgrind), que debería deshacerse de algunos falsos positivos. – vanza

+0

Dos fugas en glib, una fuga en FreeType. No culpe a Qt, creo :) – Torp

Respuesta

3

He compilado su aplicación corta y (utilizando el estudio visual crt memoryleak detector) no pudo encontrar ninguna pérdida de memoria. Entonces, lo que valgrind informe no está directamente relacionado con su código.

Sin embargo, está eliminando QPushButton antes de que la aplicación se esté ejecutando realmente. Por lo general, la propiedad de QWindows se transfiere a la ventana primaria, por lo que no es necesario que limpie los objetos usted mismo, la ventana principal maneja eso por usted (si este no es el caso, se indica en la documentación).

Por lo tanto, para corregir su código, simplemente elimine la eliminación.

Cuestiones relacionadas