通常在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退出时,组件却没有关闭,这就会造成程序崩溃。