WebKit中的智能指针

RefCounted:

提供引用计数器功能。使用时继承之

 

  1. class Foo : public RefCounted<Foo>  

 

为了更为方便安全地使用引用计数功能,webkit提供了RefPtr。

ThreadSafeShared

多线程版本的引用计数

 

RefPtr / PassRefPtr

保存支持引用计数的指针(如RefCount,ThreadSafeShared等子类, 又如StringImpl),防止cyclic references?
RefPtr 与 PassRefPtr 基本类似,区别在于作为参数进行传递时引用计数的变化。
RefPtr 作为参数对 RefPtr 和 PassRefPtr 进行赋值或构造,会对参数 RefPtr 的指针增加引用计数。
PassRefPtr 作为参数对 RefPtr 和 PassRefPtr 进行构造或赋值,会转移指针拥有权,故参数 PassRefPtr 那个指针的引用计数不变。
当然,赋值操作会减少被赋值对象原先拥有的指针的引用计数。

用指针构造RefPtr和PassRefPtr会增加其引用计数。

PassRefPtr<T>::leakRef():     交出拥有权
adoptRef():                                构造PassRefPtr,仅获得指针拥有权
RefPtr::release():                      拥有权转移给PassRefPtr(返回值)


一般推荐使用 RefPtr, 但是在作为参数传递或作为返回值的时候,使用 PassRefPtr更为高效, 因为这两种情况编译器会生成临时变量, 若用 RefPtr, 就会多一次引用计数的增减(临时变量构造和销毁)。


OwnPtr / PassOwnPtr

不采用引用计数方式,可以保存一般的指针. 一个指针只能被一个 OwnPtr 或 PassOwnPtr 唯一拥有, 采用摧毁式拷贝策略, 类似std::auto_ptr

posted @ 2013-04-14 22:21  JustinYo  阅读(370)  评论(0编辑  收藏  举报