首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Basic Qt应用程序的评估:报告最大的泄漏

Basic Qt应用程序的评估:报告最大的泄漏
EN

Stack Overflow用户
提问于 2011-08-13 06:38:32
回答 1查看 2.9K关注 0票数 9

因此,我想看看从一个简单的Makefile编译的基本Qt4应用程序在运行Val差路时会发生什么情况。是什么导致了这些泄漏?我正在删除我端的任何动态分配的对象。此外,当退出程序,我只点击关闭(X)上右上角。GUI库只是没有“空闲()”任何它们的malloc()d内存

qmake命令中减少的Makefile是:

代码语言:javascript
复制
####### 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

唯一的源代码是:

代码语言:javascript
复制
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时,我得到以下内容(在中间删除了很大一部分):

代码语言:javascript
复制
==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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-13 12:47:54

我编译了您的简短应用程序,并且(使用visual内存泄漏检测器)找不到任何内存泄漏。所以,不管是哪种类型的报告,都与代码没有直接关系。

但是,在应用程序实际运行之前,您正在删除QPushButton。通常,QWindows的所有权被转移到父窗口,因此您不需要自己清理对象,父窗口为您处理这个问题(如果不是这样的话,请在文档中说明)。

因此,要更正您的代码,只需删除删除。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7049036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档