• 11990阅读
  • 6回复

请问qt里面new出来的内存自己会释放吗? [复制链接]

上一主题 下一主题
离线dyq2008
 
只看楼主 倒序阅读 楼主  发表于: 2007-06-13
— 本帖被 XChinux 执行加亮操作(2007-06-14) —
例如我创建了一个类,构造函数如下
MyWindow::MyWindow(QWidget *parent, const char *name,WFlags f)
            : QMainWindow(parent,name,f | WDestructiveClose)
{
        QPushButton *button = new QPushButton("hello",this);
}
那我如果用它创建了一个窗口,然后又把他关掉,new出来的内存自己会释放吗?
请教了。。。
[ 此贴被XChinux在2007-06-14 09:02重新编辑 ]
离线hehui

只看该作者 1楼 发表于: 2007-06-13
好像会的!
待牛人来答!!
离线XChinux

只看该作者 2楼 发表于: 2007-06-14
指定了parent的,它在父部件析构时它里面的子部件也会被析构。如果没有指定,最好自己来删除。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线jzj139
只看该作者 3楼 发表于: 2007-06-14
QT的父子对象机制是在 QWidget和QOject中实现的。当我们使用父对象来创建一个对象的时候 ,父对象会把这个 对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。
      这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显示删除(就是用DELETE)的对象是那些使用NEW船舰的并且没有父对象的对象。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。
qt
离线dyq2008
只看该作者 4楼 发表于: 2007-06-14
我比较疑惑如果我没有写析构函数的话,默认的析构函数都干了些什么?
它知道我申请了哪些动态内存吗?
离线jzj139
只看该作者 5楼 发表于: 2007-06-14
析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。
(当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。)在这个时候系统自动的调用,来清除被占用的动态堆空间,从而防止了内存泄露的风险。
qt
离线hyrish
只看该作者 6楼 发表于: 2007-06-15
如果new一个Qt的对象,没有指定父对象,但没有用delete的话
那就只会在主程序结束时自动释放,不会造成内存泄漏
如果new一个Qt的对象,指定了父对象,没有用delete的话,
则由它的父对象自动管理,你不用去关心它。
快速回复
限100 字节
 
上一个 下一个