Qt这样会造成内存泄漏吗

sno_guo 2012-09-11 10:14:57
大家好,用Qt没有多长时间,我想测试下我的程序是否造成了内存泄漏,
大概思路是: 我在一个函数中new了一个局部变量,但是直到这个窗口退出也没有释放掉,请问下这样会造成 一些内存泄漏吗, 谢谢, 如果泄漏了,我怎么能知道他泄漏了呢:


下面是写的一个简单的测试程序,如下
#include "widget.h"
#include <QGroupBox>
#include <QHBoxLayout>
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
creategrpbox();
QHBoxLayout *mainlayout=new QHBoxLayout;

mainlayout->addWidget(m_grpbox);
setLayout(mainlayout);
}

Widget::~Widget()
{ //我在析够函数里什么都没有做。
}
void Widget::creategrpbox()
{
m_grpbox =new QGroupBox;
QLabel *label=new QLabel("test label"); //这里new了一个指针,但是这个指针是局部变量,退出这个函数后就没有了
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(&label);
m_grpbox->setLayout(layout);
}

...全文
761 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色記憶 2012-09-24
  • 打赏
  • 举报
回复
去看看Qt的对象树机制和QObject的内存管理管理机制就ok了。
addfourliu 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

如果你是在VS下开发Qt应用,可以试试Visual Leak Detector for Visual C++。
[/Quote]

+1
不过ubuntu下面就不清楚了。。。
sno_guo 2012-09-21
  • 打赏
  • 举报
回复
哦,谢谢,我的是在linux内核的ubuntu下做的,版本是ubuntuLTS,打印如下:

sno@sno-desktop:~$ uname -a
Linux sno-desktop 2.6.32-42-generic #96-Ubuntu SMP Wed Aug 15 18:57:09 UTC 2012 i686 GNU/Linux
adq1_2 2012-09-21
  • 打赏
  • 举报
回复
如果你是在VS下开发Qt应用,可以试试Visual Leak Detector for Visual C++。
sno_guo 2012-09-21
  • 打赏
  • 举报
回复
呵呵,这个我知道的,我是说,我用什么软件来检查我的Qt程序是否有内存泄漏的问题。

我试过valgrind这个软件,可是他会报乱七八糟的东西,不能直接我要的东西。

请问下有哪些好软件吗,谢谢!
addfourliu 2012-09-21
  • 打赏
  • 举报
回复
当然会有内存泄漏啦。。。。自己new出来的对象 , 都要自己负责删除,Qt不会帮你自动删除的。。。
但是如果你new的对象有父对象,那么父对象删除的时候,子对象也跟着被删除。。。如果你new的对象没有指定父对象,那么就会造成内存泄露的情况。。。

你说你new的是局部变量,程序退出后,变量就没了。。。
是的,不过你new的是一个指针变量,虽然指针没有了,但是指针指向的内存块还存在,也正是因为指针没有了,所以Qt才不知道如何去删除这块内存,于是内存泄露。。。
sno_guo 2012-09-21
  • 打赏
  • 举报
回复
这个我知道,嵌入式linux中很多都是用Qt来做的,可是不一定Qt就不导致内存泄漏,比如我在里面定义一个指针,malloc后忘记 free了,这样 Qt也能帮我free掉吗,谢谢!


  • 打赏
  • 举报
回复
e..要对Qt有信心。。
现在很多嵌入式上的DD,还不多用Qt做UI。。。

话说valgrind只要关注你自己工程的部分就好了。。
sno_guo 2012-09-18
  • 打赏
  • 举报
回复
哦,谢谢,那么既然valgrind报的错误我可以忽略,那么我应该用什么方法才能检查到Qt的内存泄漏呢。

Qt难道真的可以做到内存不泄漏吗,??
  • 打赏
  • 举报
回复
哦。 这个Qt内部的不用管他。没有内存泄漏哈。

这些分配的内存空间是在初始化的时候产生的。 而且只一次。生命周期的结束是在程序退出的时候。

所以Valgrind报的Qt库的可以忽略掉哈。
sno_guo 2012-09-15
  • 打赏
  • 举报
回复
谢谢,刚才我用valgrind测试了一下,发现即使我Qt中什么都没有做,还是会有内存泄漏,请问下这个是什么问题,谢谢
我的测试就是创建一个新的Qwidget,然后显示出来,自己一个字母都没有打,完全是Qt生成的,为什么还有内存泄漏,谢谢!


#include "ctestmemory.h"

CTestMemory::CTestMemory(QWidget *parent)
: QWidget(parent)
{
}

CTestMemory::~CTestMemory()
{

}

我用valgrind打印如下:
==8148== Memcheck, a memory error detector
==8148== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==8148== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==8148== Command: ./testmemory
==8148==
==8148==
==8148== HEAP SUMMARY:
==8148== in use at exit: 1,371,453 bytes in 9,021 blocks
==8148== total heap usage: 44,553 allocs, 35,532 frees, 4,908,935 bytes allocated
==8148==
==8148== 1 bytes in 1 blocks are possibly lost in loss record 1 of 4,630
==8148== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==8148== by 0x514A243: g_malloc (in /lib/libglib-2.0.so.0.2400.1)
==8148== by 0x5162D68: g_strdup (in /lib/libglib-2.0.so.0.2400.1)
==8148== by 0x5297E29: g_param_spec_string (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x5DFA25B: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)
==8148== by 0x52AD51D: g_type_class_ref (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x52934C1: g_object_newv (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x5293A47: g_object_new (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x5DF8FA7: gtk_settings_get_for_screen (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)
==8148== by 0x5DF9136: gtk_settings_get_default (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)
==8148== by 0x698BAB4: ??? (in /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so)
==8148== by 0x698BC43: gtk_module_init (in /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so)
==8148==
==8148== 1 bytes in 1 blocks are possibly lost in loss record 2 of 4,630
==8148== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==8148== by 0x514A243: g_malloc (in /lib/libglib-2.0.so.0.2400.1)
==8148== by 0x5162D68: g_strdup (in /lib/libglib-2.0.so.0.2400.1)
==8148== by 0x5297E29: g_param_spec_string (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x5D96004: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)
==8148== by 0x52AD51D: g_type_class_ref (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x698BB96: ??? (in /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so)
==8148== by 0x698BCA8: gtk_module_init (in /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so)
==8148== by 0x5D9E354: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)
==8148== by 0x52994E7: g_cclosure_marshal_VOID__PARAM (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x528C251: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148== by 0x52A099C: ??? (in /usr/lib/libgobject-2.0.so.0.2400.1)
==8148==
==8148== by 0x521BCBE: FT_New_Face (in /usr/lib/libfreetype.so.6.3.22)
==8148==
==8148== LEAK SUMMARY:
==8148== definitely lost: 3,864 bytes in 22 blocks
==8148== indirectly lost: 10,652 bytes in 509 blocks
==8148== possibly lost: 981,058 bytes in 3,453 blocks
==8148== still reachable: 375,879 bytes in 5,037 blocks
==8148== suppressed: 0 bytes in 0 blocks
==8148== Reachable blocks (those to which a pointer was found) are not shown.
==8148== To see them, rerun with: --leak-check=full --show-reachable=yes
==8148==
==8148== For counts of detected and suppressed errors, rerun with: -v
==8148== ERROR SUMMARY: 1361 errors from 1361 contexts (suppressed: 213 from 12)

发现也泄漏,不清楚为什么,请大牛帮忙解惑,谢谢!
sno_guo 2012-09-12
  • 打赏
  • 举报
回复
哦,谢谢,可是我的程序正常运行,无论我怎么测试他,他都是好的,这个怎么解释呢,

还有我看这个文章,发现Qt会自动回收,是这样吗?
http://topic.csdn.net/u/20120911/15/ed46ee44-f26d-439a-99ea-07f108e5bf81.html


如果泄漏了,我怎样能看到他泄漏了,或者我怎么知道是否泄漏呢,谢谢!
wopabe 2012-09-12
  • 打赏
  • 举报
回复
怎么不delete呢?
肯定泄露啊
  • 打赏
  • 举报
回复
嗯哪是的。。


sno_guo 2012-09-12
  • 打赏
  • 举报
回复
哦,谢谢,你的意思是:
我每次new 一个控件,如QLabel,我都需要 在这样定义是吗:
QLabel *label=new QLabel("test memory",this);
QCheckBox *chkbox=new QCheckBox("this",this);

就是说我每次创建一个控件,都需要给他加上 一个父类this, 是吗,谢谢!
  • 打赏
  • 举报
回复
Qt 自动回收不像Java这种,有垃圾回收机制。
Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。
所以为什么 main函数 里面 main widget是分配在栈上的原因。其他new出来的东西都以这个widget作为父亲。
当程序最后结束了,main widget弹栈。。父亲被销毁。。孩子跟着被销毁。。


所以如果你自己new 出来的。没有父亲,不删除就会造成内存泄漏。

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧