Qt中的“析构”机制、QObject *parent、注意事项
2017-08-22 09:25
381 查看
在C++中,使用new在堆中创建的对象,需要使用delete来析构对象,从而释放堆中的内存的。
在Qt中,往往new出来的对象却不需要我们手动delete,这是因为Qt替我们做了delete这件事。
QObject *parent,有时候是QWidget *parent:
在很多时候,我们创建一个对象(无论是直接创建,还是new出来一个),都需要传入一个“parent”指针或者手动调用setParent(*parent)函数来指定一个“父窗口”,默认的parent指针是空,此时的“父窗口”为当前的操作系统。
当指定了“父窗口”之后,该窗口的析构就由父窗口来接管,Qt会保证在合适的时候析构该窗口,并且只析构一次。这是一个很优秀的机制。
说明:
堆对象/new出来的对象:
①QObject *parent/QWidget *parent,当指定了parent后,Qt就会介入,在合适的时候调用对应的delete操作。
②在不指定parent时,最好手动设计delete,否则这个对象的内存空间将交给操作系统来管理,通常在整个程序关闭以后,操作系统会回收该内存,一般也不会造成问题,但这毕竟是一个潜在的危险,有隐患。
栈对象:
③栈是“先入后出,后入先出”的方式,因此在创建栈对象的时候,要注意顺序,举一个例子说明:
a>出错例子:
在点击了“关闭”之后,程序崩溃了,原因是:因为btn指定了父窗口w,在关闭w时,Qt的析构机制的做法是先析构btn再析构w;在创建对象的时候,btn先创建w后创建,在栈的“先入后出,后入先出”方式下,w先出栈,btn后出栈,而此时btn已经在前面出栈了(Qt的析构机制),导致现在程序崩溃。
b>改正后
这样做,在点击“关闭”时,便先会将btn出栈,Qt的析构机制检测到btn已出栈,便不会再进行析构了。
在Qt中,往往new出来的对象却不需要我们手动delete,这是因为Qt替我们做了delete这件事。
QObject *parent,有时候是QWidget *parent:
在很多时候,我们创建一个对象(无论是直接创建,还是new出来一个),都需要传入一个“parent”指针或者手动调用setParent(*parent)函数来指定一个“父窗口”,默认的parent指针是空,此时的“父窗口”为当前的操作系统。
当指定了“父窗口”之后,该窗口的析构就由父窗口来接管,Qt会保证在合适的时候析构该窗口,并且只析构一次。这是一个很优秀的机制。
说明:
堆对象/new出来的对象:
①QObject *parent/QWidget *parent,当指定了parent后,Qt就会介入,在合适的时候调用对应的delete操作。
②在不指定parent时,最好手动设计delete,否则这个对象的内存空间将交给操作系统来管理,通常在整个程序关闭以后,操作系统会回收该内存,一般也不会造成问题,但这毕竟是一个潜在的危险,有隐患。
栈对象:
③栈是“先入后出,后入先出”的方式,因此在创建栈对象的时候,要注意顺序,举一个例子说明:
a>出错例子:
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton btn;//先创建QPushButton
QWidget w;//后创建QWidget
w.show();
btn.setText("Helloworld");
btn.setParent(&w);//传入了w作为父窗口
btn.show();
return a.exec();
}
在点击了“关闭”之后,程序崩溃了,原因是:因为btn指定了父窗口w,在关闭w时,Qt的析构机制的做法是先析构btn再析构w;在创建对象的时候,btn先创建w后创建,在栈的“先入后出,后入先出”方式下,w先出栈,btn后出栈,而此时btn已经在前面出栈了(Qt的析构机制),导致现在程序崩溃。
b>改正后
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.show();
QPushButton btn;//将QPushButton的创建放在QWidget之后
btn.setText("Helloworld");
btn.setParent(&w);
btn.show();
return a.exec();
}
这样做,在点击“关闭”时,便先会将btn出栈,Qt的析构机制检测到btn已出栈,便不会再进行析构了。
相关文章推荐
- QT信号和槽机制注意事项
- QT信号和槽机制的注意事项
- Android:onNewIntent()触发机制及注意事项
- 【iOS开发-34】自动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- Qt中QObject中的parent参数
- Qt容器之QVector,QMap,QHash,QList等注意事项
- 解读QT信号与槽机制里 QMetaObject::connectSlotsByName(QObject *o)的源码 介绍 connectSlotsByName 是一个QMetaObject类里的
- Qt中如何使用样式表QPalette以及相关注意事项
- qt在linux下开发注意事项
- qt使用QWT注意事项
- QT 线程中使用子线程操作注意事项
- Android:onNewIntent()触发机制及注意事项
- ubuntu12.04(64位)中qt安装mysql驱动插件注意事项
- qt/Embedded版本 修改编译工具 注意事项
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- Advanced Qt Programming一书中源代码项目编译注意事项
- ubuntu安装qt注意事项和可能遇到的问题
- QT Embedded-----QObject:元对象、signal/slot机制
- Android:onNewIntent()触发机制及注意事项