轉自:http://blog.chinaunix.net/u3/90973/showart_2163813.html
sp和wp的實現過程~~
個人覺得sp和wp實際上就是android 為其c++實現的自動垃圾 回收機制 ,具體到內部實現,sp和wp實際上只是一個實現記憶體回收功能的介面 而已,比如說對*,->的重載,是為了其看起來跟真正的指標一樣,而真正實現記憶體回收的是refbase這個基類。這部分代碼的目錄 在:/frameworks/base/include/utils/RefBase.h
首先所有的類都會虛繼承refbase類,因為它實現了達到記憶體回收所需要的所有function,因此實際上所有的對象聲明出來以後都具備了自動 釋放自己的能力,也就是說實際上智能指標就是我們的對象本身,它會維持一個對本身強引用和弱引用的計數,一旦強引用計數為0它就會釋放掉自己。
首先我們看sp,sp實際上不是smart pointer的縮寫,而是strong pointer,它實際上內部就包含了一個指向對象的指標而已。我們可以簡單看看sp的一個建構函式:
template<typename T>
sp<T>::sp(T* other)
: m_ptr(other)
{
if (other) other->incStrong(this);
}
比如說我們聲明一個對象:
sp<CameraHardwareInterface> hardware(new CameraHal());
實際上sp指標對本身沒有進行什麼操作,就是一個指標的賦值,包含了一個指向對象的指標,但是對象會對對象本身增加一個強引用計數,這個 incStrong的實現就在refbase類裡面。新new出來一個CameraHal對象,將它的值給 sp<CameraHardwareInterface>的時候,它的強引用計數就會從0變為1。因此每次將對象賦值給一個sp指標的時候, 對象的強引用計數都會加1,下面我們再看看sp的解構函式:
template<typename T>
sp<T>::~sp()
{
if (m_ptr) m_ptr->decStrong(this);
}
實際上每次delete一個sp對象的時候,sp指標指向的對象的強引用計數就會減一,當對象的強引用技術 為0的時候這個對象就會被自動釋放掉。
wp就是weak pointer的縮寫,wp 這個指標類,實際上他是一個弱參考型別的指標類,弱引用是在.net 以及java 中經常用到的,弱引用是一個對象引用的持有人,使用弱引用後可以維持對對象的引用,但是不會阻止其被記憶體回收。如果一個對象只有弱引用了,那它就成為被記憶體回收的候選對象,就像沒有剩餘的引用一樣,而且一旦對象被刪除,所有的弱引用也會被清楚。弱引用適合那些資料 成員特別多,而且重新建立又相對容易的類,也就是俗稱的胖子類,建立弱引用可以引用對象,但也不阻止其被記憶體回收,在記憶體的使用方面取得一定的平衡。
在android 中wp 類裡面的promote 函數實際上就是將一個弱引用升級為一個強引用。不管是sp 還是wp ,實際上都是android 利用現有的c++ 特性來解決記憶體使用量和回收的一種手段。
,就是為了減少對那些胖子物件對記憶體的佔用,我們首先來看wp的一個建構函式:
wp<T>::wp(T* other)
: m_ptr(other)
{
if (other) m_refs = other->createWeak(this);
}
它和sp一樣實際上也就是僅僅對指標進行了賦值而已,對象本身會增加一個對自身的弱引用計數,同時wp還包含一個m_ref指標,這個指標主要是用來將wp升級為sp時候使用的:
template<typename T>
sp<T> wp<T>::promote() const
{
return sp<T>(m_ptr, m_refs);
}
template<typename T>
sp<T>::sp(T* p, weakref_type* refs)
: m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)
{
}
實際上我們對wp指標唯一能做的就是將wp指標升級為一個sp指標,然後判斷是否升級成功,如果成功說明對象依舊存在,如果失敗說明對象已經被釋放掉了。wp指標我現在看到的是在單例中使用很多,確保mhardware對象只有一個,比如:
wp<CameraHardwareInterface> CameraHardwareStub::singleton;
sp<CameraHardwareInterface> CameraHal::createInstance()
{
LOG_FUNCTION_NAME
if (singleton != 0) {
sp<CameraHardwareInterface> hardware = singleton.promote();
if (hardware != 0) {
return hardware;
}
}
sp<CameraHardwareInterface> hardware(new CameraHal()); //強引用加1
singleton = hardware;//弱引用加1
return hardware;//賦值建構函式,強引用加1
}
//hardware被刪除,強引用減1
keywords:
android sp wp