WebKit中的智能指针
RefCounted:
提供引用计数器功能。使用时继承之
- 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