有关Qt的指针的问题

thulongkang 2012-07-09 07:48:11
最近在学习Qt,发现有的程序使用某一些类来动态分配内存,例如QWidget *widget=new QWidget;QSlider *slider=new QSlider;然后程序中就是运用这些指针来调用相应的函数,但是在程序中却没有delete语句,我想知道这在Qt中是否安全?是不是没有必要delete掉?如果是这样的话,这和C++的习惯 有点矛盾啊!求解释。
...全文
223 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
thulongkang 2012-07-09
  • 打赏
  • 举报
回复
额,确实水平还不是很高。不过一楼的挺详细了,以后应该也会注意到他说的那几点。
addfourliu 2012-07-09
  • 打赏
  • 举报
回复
一般来说,我们这个水平层的,写的类都是继承QObject的或者是一些事件类

http://download.csdn.net/download/addfourliu/4419460

thulongkang 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

楼上+1

简单的来说就是:有父对象的子类不用delete,如果没有父对象的,要delete
[/Quote]嗯,受教育了。但是看了你们的回复,我目前就知道QObject是Qt中的一个比较常用的父亲类,其他的一些Qt的自有类在操作时我也会怀疑该不该delete.要是有一份具体的类的派生和继承关系图就好了。
另外,我自己写一个类,那么,在进行动态内存分配的时候,是必须在代码中写delete的吧??
addfourliu 2012-07-09
  • 打赏
  • 举报
回复
楼上+1

简单的来说就是:有父对象的子类不用delete,如果没有父对象的,要delete
Anitee 2012-07-09
  • 打赏
  • 举报
回复
在Qt的程序中经常会看到只有new而不delete的情况,其实是因为Qt有一套回收内存的机制,主要的规则如下:
1.所有继承自QObject类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QObject类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;

2.程序通常最上层会有一个根的QObject,就是放在setCentralWidget()中的那个QObject,这个QObject在 new的时候不必指定它的父亲,因为这个语句将设定它的父亲为总的QApplication,当整个QApplication没有时它就自动清理,所以也无需清理。这里Qt4和Qt3有不同,Qt3中用的是setmainwidget函数,但是这个函数不作为里面QObject的父亲,所以Qt3中这个顶层的QObject要自行销毁)。

3.这是有人可能会问那如果我自行delete掉这些Qt接管负责销毁的指针了会出现什么情况呢,如果这么做的话,正常情况下被delete的对象的父亲会知道这件事情,它会知道它的儿子被你直接delete了,这样它会将这个儿子移出它的列表,并且重新构建显示内容,但是直接这样做是有风险的!也就是要说的下一条。

4.当一个QObject正在接受事件队列时如果中途被你DELETE掉了,就是出现问题了,所以Qt中建议大家不要直接DELETE掉一个QObject,如果一定要这样做,要使用QObject的deleteLater()函数,它会让所有事件都发送完一切处理好后马上清除这片内存,而且就算调用多次的deletelater也不会有问题。

5.Qt不建议在一个QObject对象的父亲的范围之外持有对这个对象的指针,因为如果这样外面的指针很可能不会察觉这个QObject被释放,会出现错误。如果一定要这样,就要记住你在哪这样做了,然后抓住那个被你违规使用的QObject的destroyed()信号,当它没有时赶快置零你的外部指针。当然我认为这样做是及其麻烦也不符合高效率编程规范的,所以如果要这样在外部持有QObject的指针,建议使用引用或者用智能指针,如Qt就提供了智能指针针对这些情况,见最后一条。

6.Qt中的智能指针封装为QPointer类,所有QObject的子类都可以用这个智能指针来包装,很多用法与普通指针一样,可以详见Qt assistant
为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧