Valgrind о базовом приложении Qt: сообщает о существенных утечках - PullRequest
9 голосов
/ 13 августа 2011

Итак, я хотел посмотреть, что произойдет с базовым приложением Qt4, скомпилированным из простого Makefile при запуске через Valgrind. Что будет причиной этих утечек? Я удаляю любые динамически размещенные объекты на моем конце. Также при выходе из программы я нажимаю только на кнопку закрытия (X) вверху в правом верхнем углу. У библиотек GUI просто нет "free ()" какой-либо памяти, которую они malloc () 'd ?

Makefile, уменьшенный из команды qmake:

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

Единственный исходный код:

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

При прохождении через valgrind я получаю следующее (Удалена большая часть посередине):

==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 Ответ

3 голосов
/ 13 августа 2011

Я скомпилировал ваше короткое приложение и (используя детектор утечки памяти visual studio crt) не смог обнаружить утечки памяти.Поэтому все отчеты valgrind не имеют прямого отношения к вашему коду.

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

Итак, чтобы исправить свой код, просто удалите удаление.

...