Qt中的“析构”机制、QObject *parent、注意事项

在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已出栈,便不会再进行析构了。 

  • 30
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值