如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。
这里介绍几个C++和Qt中的智能指针:
auto_ptr
auto_ptr 是C++98标准化引入的,带有缺陷的设计,虽说简单,但使用起来却到处是坑,以至于大家都不提倡使用。
scoped_ptr
scoped_ptr 是C++11标准化引入的,可以防止拷贝,设计简单粗暴但是功能不全,用的也不是很多。
shared_ptr
shared_ptr 是C++11标准化引入的,引用计数的智能指针,被奉为裸指针的完美替身,因此被广泛使用。功能强大支持拷贝、支持定制删除器,但也存在缺陷,那就是可以循环引用,需要和 weak_ptr 配合来解决。
QPointer
QPointer是一个模板类。它很类似一个普通的指针,不同之处在于,QPointer 可以监视动态分配空间的对象,并且在对象被 delete 的时候及时更新。
QPointer的现实原理:在QPointer中保存了一个QObject的指针,并把这个指针的指针(双指针)交给全局变量管理,而QObject 在销毁时会调用 QObjectPrivate::clearGuards 函数来把全局 GuardHash 的那个双指针置为*零,因为是双指针的问题,所以QPointer中指针当然也为零了。用isNull 判断就为空了。