qt显示label--勘误

通常在qt下,我们显示一个labe,代码如下:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   // MainWindow w;
    //w.show();

    // 方案一
    QLabel label("Hello,World");
    label.show();

    // 方案二
    //QLabel * label = new QLabel("Hello,world");
    //label->show();

    return app.exec();
}

这样显示是没什么问题的!



还可以这样显示label:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   // MainWindow w;
    //w.show();

    // 方案一
    //QLabel label("Hello,World");
    //label.show();

    // 方案二
    QLabel * label = new QLabel("Hello,world");
    label->show();

    return app.exec();
}


这样程序跑起来也是没有问题的。


但是实际答案是这样写,是不可以的,为什么呢?


首先,按照标准C++来看这段程序。这里存在着内存泄露。当exec()退出时(也就是事件循环结束的时候。窗口关闭,事件循环就会结束),labe是没办法delete的。这就是造成了内存泄露。当然,由于程序结束,操作系统会负责回收内存,所以这个问题不会很严重。即便你这样修改了代码再运行,也不会有任何错误。

严重的是,label是建立在堆上的,app是建立在栈上的。这意味着,label会在app之后析构。也就是说,label的生命周期长于app的生命周期。这可是qt编程的大忌。因为在qt中,所有的qpaintdevice必须要在有qapplication实例的情况下创建和使用。大家好奇的话,可以提一句,qlabel继承自qwidget,qwidget则是qpaintdevice的子类。之所以上面的代码不会有问题,是因为app退出时,label已经关闭,这样的话,label的所有qpaintdevice一般都不会被访问到了。但是,如果我们的程序,在app退出时,组件却没有关闭,这就会造成程序崩溃。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值