2011-08-13 38 views
9

所以我想看看在通過Valgrind運行時,從簡單的Makefile編譯的基本Qt4應用程序會發生什麼。什麼會造成這些泄漏?我正在刪除我的結尾上的任何動態分配的對象。另外退出程序時,我只需點擊右上角的關閉(X)。做GUI庫只是不是「免費()」他們的任何內存malloc()'d基於Qt應用的Valgrind:報告嚴重泄漏

的生成文件從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

這有點關係。您應該再次嘗試使用-O0並查看它是否更改(有時優化會混淆valgrind) – Owen

+1

由於您使用的是支持glib的QT,請嘗試閱讀[此鏈接](http://live.gnome.org/Valgrind),其中應該擺脫一些誤報。 – vanza

+0

glib中有兩處泄漏,FreeType中有一處泄漏。不要怪Qt我認爲:) – Torp

回答

3

我編譯了你的短應用程序和(使用visual studio crt memory leak檢測器)找不到任何內存泄漏。因此,無論valgrind報告與您的代碼沒有直接關係。

但是,在應用程序實際運行之前,您正在刪除QPushButton。通常QWindows的所有權被轉移到父窗口,所以你不需要自己清理對象,父窗口爲你處理(如果不是這種情況,它在文檔中說明)。

因此,要更正您的代碼,只需刪除刪除。