最近Qt的blog总结了到底有多少种smart pointer, 下面是一个简要的介绍:

1.   ​​QPointer​​ :提供对指针的保护,当一个指针被删除以后,再使用不会造成野指针或者指针溢出。比如

QPointer<MyObj> obj …;

if(!obj.isNull()) obj->foo;// 成功

… //对象被另外一个线程删除了

if(!obj.isNull()) obj->foo;// 不会造成内存错误,该函数不会被调用

(2009/10/27更正:需要加入if(!obj.isNull()) 进行判断,多谢linkerlin指出)

2.   ​​QSharedDataPointer​​:提供对数据的COPY-ON-WRITE,提供对数据(注:请区别于指向数据的指针)的线程安全的保护。(注:提供对数据的线程安全保护要结合QsharedData来完成)

3.   ​​QExplicitlySharedDataPointer​​:类似tr1::shared_ptr,提供对数据的线程安全的保护

4.   ​​QtPatternist::AutoPtr​​ (internal class):其实现的功能已经完全被后面的QscopedPointer替代。

5.   ​​QSharedPointer​​:类似tr1::shared_ptr,也可以提供线程安全保护,与QSharedDataPointer不同的是,线程安全的保护仅限于指针而不是指针所指的对象数据。

6.   ​​QWeakPointer​​:类似tr1::weak_ptr伴随QsharedPointer产生,可以提供比QPointer更好的性能

7.   ​​QGuard​​ (internal class): 内部类,主要用来替换QPointer而实现更好的性能

8.   ​​QScopedPointer​​:类似tr1::auto_ptr,可以很方便的实现RAII,而且提供了一个可以定制的deallocator, 因此使用auto_ptr但是苦于没有办法用delete[]的同学们就有福了。

当然你或许会问为什么不用tr1, boost。这个问题也在blog中被回答了,因此Qt是一个跨平台的库,不能保证每个平台上的编译器都实现了tr1,比如Sun Studio compiler on Solaris (Sun Studio 12, with CC 5.10)仍然只支持C++98以前的标准。当然,还有其他的很多原因,比如风格/缺失某些属性之类的。