sp和wp指针用法分析

涉及的源文件

frameworks\base\include\utils\RefBase.h

frameworks\base\include\utils\Atomic.h

frameworks\base\libs\utils\RefBase.cpp

 

RefBase类是android native中所有类的基类

sp类是strong pointer

wp类是weak pointer

 

简略实例分析

class A :public RefBase

{

}

 

int main()

{

    A* pA = new A();-----------------------(1)

{

    sp<A> spA(pA);------------------------(2)

    wp<A> wpA(pA);-----------------------(3)

}

------------------------------------------------(4)

}

 

(1)构建对象pA-------------------------------------------->我们称之为实际对象

1>查看RefBase的构造函数

RefBase::RefBase()
    : mRefs(new weakref_impl(this))
{
//    LOGV("Creating refs %p with RefBase %p\n", mRefs, this);
}

同时,构建了一个mRefs对象---------------------->我们称之为影子对象

2>查看weakref_impl的构造函数

    weakref_impl派生于RefBase的内部类weakref_type

    weakref_impl(RefBase* base)
        : mStrong(INITIAL_STRONG_VALUE)----------------->sp 引用计数
        , mWeak(0)---------------------------------------------------->wp引用计数
        , mBase(base)------------------------------------------------>实际对象,也就是pA
        , mFlags(0)
        , mDestroyer(0)
    {
    }

 

(2)sp引用spA

成员变量m_ptr---------------->实际对象,也就是pA

mWeak == 1

mStrong==1

 

(3)wp引用对象wpA

成员变量m_ptr--------------->实际对象,也就是pA

m_refs-------------------------->影子对象,也就是mRefs

mWeak=1;

 

(4)析构spA,wpA

至此,mStrong==1, mWeak==2

mStrong==0时,delete 实际对象pA

mWeak==0时,delete影子对象mRefs

你可能感兴趣的:(SP,wp指针)