文档介绍:踏雪无痕
Qt 内存管理机制
分类: C++ 2011-08-03 08:59 287人阅读评论(0) 收藏举报
 
标签:qt 内存
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责
任。./448512/526734
这篇文章首先发布于我的主页 o,以后也会直接发布在那里。现在有 Flex 4 的一篇和
《从 C++ 到 Objective-C》系列,感谢大家支持!
强类型语言在创建对象时总会显式或隐式地包含对象的类型信息。也就是说,强类型语言在分配对象内存空间时,
总会关联上对象的类型。相比之下,弱类型语言则不会这样做。在分配了内存空间之后,有两种方法释放空间:手
工释放,或者是使用垃圾收集器。C++ 要求开发者手工释放内存空间。这样做的好处是,开发者对内存有完全的控
制能力,知道什么时候释放比较合适。Java 则使用垃圾收集器。它在后台会有一个线程根据一定的算法不停地查看
哪些对象已经不被使用,可以被回收。这样做则可以将开发者从底层实现中解放出来,只需关注于业务逻辑。
本文关注于 Qt 的内存管理,这里会使用 Qt 的机制,来实现一个简单的垃圾回收器。
C++ 内存管理机制
C++ 要求开发者自己管理内存。有三种策略:
1. 让创建的对象自己 delete 自己的子对象(这里所说的子对象,是指对象的属性,而不是子类,以下类
似);
2. 让最后一个对象处理 delete;
3. 不管内存。
最后一种通常成为“内存泄漏”,被认为是一种 bug。所以,我们现在就是要选出前面两种哪一种更合适一些。有
时候,delete 创建的对象要比 delete 它的所有子对象简单得多;有时候,找出最后一个对象也是相当困难的。
Qt 内存管理机制
Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,
则是一个对象与另一个对象的从属关系。在 Qt 中,删除父对象会将其子对象一起删除。这有助于减少 90% 的内
存问题,形成一种类似垃圾回收的机制。
QPointer
QPointer 是一个模板类。它很类似一个普通的指针,不同之处在于,QPointer 可以监视动态分配空间的对象,并
且在对象被 delete 的时候及时更新。
1. // QPointer 表现类似普通指针
2. QDate *mydate = new QDate(QDate::currentDate());
3. QPointer mypointer = mydata;
4. mydate->year(); // -> 2005
5. mypointer->year(); // -> 2005
6.
7. // 当对象 delete 之后,QPointer 会有不同的表现
8. delete mydate;
9.
10. if(mydate == NULL)
11. printf("clean pointer");
12. else
13. printf("dangling pointer");
14. //