边城 节选 ppt课件:new对象与直接变量
来源:百度文库 编辑:中财网 时间:2024/05/08 13:04:53
题记: 要知道,并不是只有初学者才会犯错。(shiroki的至理名言)最近发现了一些有意思的问题,值得memo一下。先来看段代码:
大家看得出这段代码中的问题吗? (呵呵,不要告诉我是cuteqt不能访问哦~)这段代码ms十分标准, 非常符合笔者平时写Qt程序书写main函数的习惯, 孰料想竟然是个错误的习惯,而且问题很严重哦。 给个提示:在程序退出时会aborted。如果还没想出来是什么问题,嘿嘿,没关系,看了下面的答案你就明白了。在这段程序里QApplication实例创建在stack上,生命期是main的大括号内, 而mw则通过new创建在heap上, 在程序退出时才会被析构。 换句话说,mw的生存期长于application的生存期…..这可是Qt编程的大忌, 因为在Qt中所有的Paint Device都必须要在有QApplication实例的情况下创建和使用。 不过如果把这个程序写出来运行一下, 未必会出现我说的aborted的问题, 大多数代码类似的程序都能安全的运行(这也是为什么用了那么多年的Qt从来没有注意过这个问题, 并且养成了我错误的编程习惯。)。 这里的trick在于application退出时mw已经被关闭, mw中的所有Paint Device一般都不会被访问到了, 所以这个错误隐藏在很深的阴暗角落, 偷偷地嘲笑我们呢!要想试验这个问题也很简单,把load的参数换成本地文件 test.html, 并把下面的内容写进test.html就能看到拉:#include#include#includeint main(int argc, char* argv[]){QApplication a(argc, argv);QWebView* mw = new QWebView;mw->show();mw->load(QUrl("http://www.cuteqt.com/blog"));return a.exec();}
-----test.html-----这个html里使用了下拉选单。 如果你运行程序并点开该选单,之后退出程序你就会看到Aborted错误提示,并打印出错误信息:“QWidget: Must construct a QApplication before a QPaintDevice”。既然提出的问题,当然也要给出解决的方案。 有两种可行的方法避免该错误。 一个当然是纠正一下编程习惯,对mw不要用new的方式创建,改在stack上创建,如下代码:
另外还可以用Qt提供的API解决此问题, 想办法让mw在application之前clean up, 那就是用WA_DeleteOnClose属性。 该属性标示窗体会在close时被析构, 这样就保证不会留存在application析构之后了, 是个很好的办法。代码如下:#include#include#includeint main(int arg, char* argv[]){QApplication a(argc, argv);QWebView mw;mw.show();mw.load(QUrl("http://www.cuteqt.com/blog"));return a.exec();}
#include#include#includeint main(int arg, char* argv[]){QApplication a(argc, argv);QWebView* mw = new QWebView;mw->show();mw->setAttribute(Qt::WA_DeleteOnClose);mw->load(QUrl("http://www.cuteqt.com/blog"));return a.exec();}
发现问题和解决问题是件很有乐趣的事情,大家不要把时间都浪费在猜测上,要多动手多思考才能进步!
javascript 字符串对象与变量区别
vb+access数据库编程中,对象变量什么时候用new,什么时候用set,这两个关键字到底有什么涵义
c++对象中的private变量不能直接被读取值么?
java math对象变量问题
vb问题:VB变量的使用范围与局部对象的探讨! 简单解答即可,谢谢!!!
系统变量与用户变量
字符串对象和字符串变量的区别
VB对象变量问题,高手帮个忙
数学公式与变量问题
无法创建VFP评分对象,错误=[未设置对象变量或 With block 变量]?
VB中如果不定义变量,而直接用,会如何?那个变量属于什么变量?
VC中 有时候对象的成员函数和变量都出不来?
asp.net中cookies对象中的cookie变量的生命周期
如何把时间变量放到APPLICATION对象里
C++中类的对象可以是变量吗?
string为什麽不new也可以创建对象??
对象不支持此属性或方法: Jpeg.New
ACCESS2003出现对象变量或WITH变量未设置是怎么回事呢?
实时错误'91'对象变量或With块变量未设置
为什么 实时错误'91': 对象变量或With块变量未设置
在VB程序调试中提示 :对象变量或with变量未设置
在VB程序调试中提示 :对象变量或with变量未设置
实时错误'91'对象变量或with块变量未设置(在线等)
老是报错说<对象变量或WITH块变量未设置>是什么原因啊?