智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。Qt常用的智能指针有QPointer,QScopedPointer,QSharedPointer。
关于这几个智能指针,网上的博客基本不是翻译Qt文档,就是翻译老外的博客,比较失望。
QPointer
QPointer属于Qt对象模型的特性,本质是一个模板类,它为QObje提供了guarded pointer
。当其指向的对象(必须是QObject及其派生类)被销毁时,它会被自动置NULL,原理是其对象析构时会执行QObject的析构函数,进而执行QObjectPrivate::clearGuards(this);
,这也是基于其指向对象都继承自QObject的原因。
QPointer对QMetaObject的相关操作做了简单的封装,这里的基本思想是
在QPointer构造的时候调用QMetaObject::addGuard(&o)
,把T的指针加入QMetaObject内的一个哈希表中,
在QPointer析构的时候调用QMetaObject::removeGuard(&o)
,把T的指针从哈希表中删除。
看代码:
QPointer<Test> t = new Test(); // Test类必须继承QObject
delete t; //对象被delete之后,t会自动置NULL,而不会成为悬挂(dangling)的野指针
if(t.isNull())
qDebug()<<"NULL";
运行后会输出NULL
。
实际中,QPointer用于解决这样的问题:在其他地方都用到了某个指针,在这个指针的对象被delete
后,将指