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后,将指针置为空,那么其他地方的指针会变为野指针。也就是在C++中有这样的代码:<