您的位置:首页 > 移动开发 > Objective-C

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>出错例子:

#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已出栈,便不会再进行析构了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息