Android中的sp和wp指针


经常会在Android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下。 

相关的代码:

frameworks/base/include/utils/RefBase.h

frameworks/base/libs/utils/RefBase.cpp

sp和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) 

  • 1
  • 2
  • 下一页

相关内容