Welcome 微信登录

首页 / 操作系统 / Linux / Android中的sp和wp指针

经常会在Android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下。 相关的代码:frameworks/base/include/utils/RefBase.hframeworks/base/libs/utils/RefBase.cppsp和wp都是一个模板类,看一下sp类的定义:
  1. template <typename T>  
  2. class sp  
  3. {  
  4. public:  
  5.     typedef typename RefBase::weakref_type weakref_type;  
  6.     inline sp() : m_ptr(0) { }  
  7.     sp(T* other);  
  8.     sp(const sp<T>& other);  
  9.     ~sp();  
  10.     ......  
  11. private:      
  12.     // Optimization for wp::promote().   
  13.     sp(T* p, weakref_type* refs);  
  14.       
  15.     T*              m_ptr;  
  16. };  
可以看到他确实封转了一个原生指针T* m_ptr. 再看一下其中一个构造函数和析构函数:
  1. template<typename T>  
  2. sp<T>::sp(T* other)  
  3.     : m_ptr(other)  
  4. {  
  5.     if (other) other->incStrong(this);  
  6. }  
  7.   
  8. template<typename T>  
  9. sp<T>::~sp()  
  10. {  
  11.     if (m_ptr) m_ptr->decStrong(this);  
  12. }  
咋一看好奇怪,因为在构造函数中调用了incStrong(),在析构函数中调用的decStrong(),显然是管理引用计数的函数,但是sp类的中并没有定义这两个函数,这两个函数是在RefBase类中定义的,由此可以得出结论:要想使用sp<T>或者wp<T>, T必需要继承RefBase类才行。 RefBase的静态关系如下:    其中weakref_type是RefBase的内嵌类,weakref_impl则是weakref_type的子类,RefBase的大部分工作都是交由weakref_impl类来完成,通过RefBase的成员变量weakref_impl* const mRefs。查看其中一个sp的构造函数:
  1. template<typename T>  
  2. sp<T>::sp(T* other)  
  3.     : m_ptr(other)  
  4. {  
  5.     if (other) other->incStrong(this);  
  6. }  
建立sp<xxx>的动态关系如下:sp<T>  --> RefBase : incStrong()  -->weakref_impl : addStrongRef()  -->android_atomic_inc(&refs->mStrong)