• 9302阅读
  • 8回复

关于析构函数 [复制链接]

上一主题 下一主题
离线溟阡
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-24

按照Qt的文档,我们派生一个基于QObject的构件时,当这个构件销毁时它自己会回收存储空间

比如说我new一个QPixmap,那是不是说如果我的程序退出了比如调了exit,这个pixmap就会自动被销毁了?还是说我需要delete它?

麻烦高人讲讲qt的析构函数吧,什么时候需要手动delete什么时候不用管它
离线sbtree
只看该作者 1楼 发表于: 2009-03-24
qt的回收机制依赖于qt类的父对象,简单的讲,如果在创建一个对象实体的时候引用了一个父对象实体,那么在父对象实体被销毁的时候,该对象也被相应的销毁了。很多时候我们往往没有使用父对象来创建一个对象实体,那么qt的类都是直接给了一个0作为父对象,这样他就成了最顶层的对象实体了,对于这种情况,最好自己实现析构函数,并使用delete释放内存,以防内存泄露。对于你提到的QPixmap类,不是继承自QObject,不存在父对象,如果用new创建一个实体,必须用delete回收内存。个人愚见,仅供参考。
windows 7 + VC++2008 + Qt4.5.2
离线netlove

只看该作者 2楼 发表于: 2009-03-24
引用第1楼sbtree于2009-03-24 15:59发表的  :
qt的回收机制依赖于qt类的父对象,简单的讲,如果在创建一个对象实体的时候引用了一个父对象实体,那么在父对象实体被销毁的时候,该对象也被相应的销毁了。很多时候我们往往没有使用父对象来创建一个对象实体,那么qt的类都是直接给了一个0作为父对象,这样他就成了最顶层的对象实体了,对于这种情况,最好自己实现析构函数,并使用delete释放内存,以防内存泄露。对于你提到的QPixmap类,不是继承自QObject,不存在父对象,如果用new创建一个实体,必须用delete回收内存。个人愚见,仅供参考。


学习下。我理解的是只要是从QOBJECT派生来的,能找到父对象的,就不用自己在析构函数中delete, 否则的话都得delete, 不知道是否正确
离线zhshzhjhust
只看该作者 3楼 发表于: 2009-03-25
引用第1楼sbtree于2009-03-24 15:59发表的  :
qt的回收机制依赖于qt类的父对象,简单的讲,如果在创建一个对象实体的时候引用了一个父对象实体,那么在父对象实体被销毁的时候,该对象也被相应的销毁了。很多时候我们往往没有使用父对象来创建一个对象实体,那么qt的类都是直接给了一个0作为父对象,这样他就成了最顶层的对象实体了,对于这种情况,最好自己实现析构函数,并使用delete释放内存,以防内存泄露。对于你提到的QPixmap类,不是继承自QObject,不存在父对象,如果用new创建一个实体,必须用delete回收内存。个人愚见,仅供参考。

我也是这么理解的
离线bingoking
只看该作者 4楼 发表于: 2009-03-25
引用第1楼sbtree于2009-03-24 15:59发表的  :
qt的回收机制依赖于qt类的父对象,简单的讲,如果在创建一个对象实体的时候引用了一个父对象实体,那么在父对象实体被销毁的时候,该对象也被相应的销毁了。很多时候我们往往没有使用父对象来创建一个对象实体,那么qt的类都是直接给了一个0作为父对象,这样他就成了最顶层的对象实体了,对于这种情况,最好自己实现析构函数,并使用delete释放内存,以防内存泄露。对于你提到的QPixmap类,不是继承自QObject,不存在父对象,如果用new创建一个实体,必须用delete回收内存。个人愚见,仅供参考。

---------------------------------------------
对,qt文档上就是这么介绍的
离线溟阡
只看该作者 5楼 发表于: 2009-03-25
比如说我写个类Test继承QWidget,作为主窗口。然后重写了CloseEvent,在这里调用了exit(0)
然后另写一个类比如ReadFile,在Test里写ReadFile* rf = new ReadFile;
按照楼上说的,我应该delete这个rf
那么在调用exit(0)之前应该自动调用析构函数吧?所以是不是我直接在析构函数中写delete rf就行了?
离线delmore
只看该作者 6楼 发表于: 2009-03-25
我觉得一楼的说的很正确,QT文档好像也是这么说的
离线zhshzhjhust
只看该作者 7楼 发表于: 2009-03-26
引用第5楼溟阡于2009-03-25 09:49发表的  :
比如说我写个类Test继承QWidget,作为主窗口。然后重写了CloseEvent,在这里调用了exit(0)
然后另写一个类比如ReadFile,在Test里写ReadFile* rf = new ReadFile;
按照楼上说的,我应该delete这个rf
那么在调用exit(0)之前应该自动调用析构函数吧?所以是不是我直接在析构函数中写delete rf就行了?

应该是的吧
离线溟阡
只看该作者 8楼 发表于: 2009-03-26
谢谢大家的热心回答~
快速回复
限100 字节
 
上一个 下一个