frameworks/rs/cpp/util/RefBase.h
#include
#include
#include
#include "RefBase.h"
using namespace std;
using namespace android::RSC;
class Person : public LightRefBase
{
public:
Person(){ cout<<"new Person()"< m = new Person();
return 0;
}
运行结果:
new Person()
~ Person
#include
#include
#include
#include "RefBase.h"
using namespace std;
using namespace android::RSC;
class Person : public LightRefBase
{
private:
sp fa;
sp so;
public:
Person(){ cout<<"new Person()"< &fao){ this->fa=fao; }
void setSo(sp &sao){ this->so=sao; }
};
int main()
{
sp m = new Person();
sp n = new Person();
return 0;
}
结果:
new Person()
new Person()
~ Person
~ Person
分析上面的代码 new Person();时会先执行内部其他对象的构造函数,再构造本身
new sp
new sp
new Person()
#include
#include
#include
#include "RefBase.h"
using namespace std;
using namespace android::RSC;
class Person : public LightRefBase
{
private:
sp fa;
sp so;
public:
Person(){ cout<<"new Person()"< &fao){ this->fa=fao; }// = 号操作会增加对象的引用计数
//this-> 表示本类中的成员(通用)
void setSo(sp &sao){ this->so=sao; }
};
int main()
{
sp m = new Person();
sp n = new Person();
m->setFa(n);
n->setFa(m);
return 0;
}
执行结果:
new Person()
new Person()
int main()
{
sp m = new Person();
sp n = new Person();
//m->setFa(n);
n->setFa(m);
return 0;
}
执行结果:
new Person()
new Person()
~ Person
~ Person
分析,
1、在上面就提到过new Person();时会先执行内部其他对象的构造函数,再构造本身,而在析构时会相反。我们可以修改StrongPointer.h的sp类增加打印消息
2、源头是对栈进行析构,~sp —> 中判断引用计数,引用计数为0时,执行对Person类的析构。
例4的结果: -------------------------- 例3的执行结果
new sp new sp
new sp new sp
new Person() new Person()
new sp new sp
new sp new sp
new Person() new Person()
系统对栈进行回收,自动执行sp的析构 ~sp
析构n
析构person
n的
首先是sp sp功能就是回收person
~sp ~sp
m_ptr->decStrong m_ptr->decStrong
~ Person 计数为0 delete
n 的person内部
~sp
~sp 对m的person引用减1 ~sp
m_ptr->decStrong m_ptr->decStrong
析构m
~sp
m_ptr->decStrong
~ Person
~sp
~sp
分析例4
要注意:在Person的析构被执行,其内部的sp才能被析构
用例3在析构时,会先执行n对应的sp的析构函数,再判断Person引用计数,由于引用计数不为1,因此导致~person没有被调用。
同样m一样。
用例4在析构时,会先执行n对应的sp的析构函数,这里n的Person引用计数为0,那么将执行~Person的函数,这里面存在sp成员,再次执行sp的析构,此sp指向m中的person,这里再判断m中的Person引用计数-1。
执行m对应的sp的析构函数,这里m的person引用计数再次减1,执行m的person的析构。
android-5.0.2/frameworks/rs/cpp/util
#ifndef RS_REF_BASE_H
#define RS_REF_BASE_H
#include
#include
#include
#include
#include "StrongPointer.h"
#include "TypeHelpers.h"
....
template
class LightRefBase
{
public:
inline LightRefBase() : mCount(0) { }
inline void incStrong(__attribute__((unused)) const void* id) const {
__sync_fetch_and_add(&mCount, 1);
}
inline void decStrong(__attribute__((unused)) const void* id) const {
if (__sync_fetch_and_sub(&mCount, 1) == 1) {
delete static_cast(this);
}
}
//! DEBUGGING ONLY: Get current strong ref count.
inline int32_t getStrongCount() const {
return mCount;
}
typedef LightRefBase basetype;
protected:
inline ~LightRefBase() { }
private:
friend class ReferenceMover;
inline static void moveReferences(void*, void const*, size_t,
const ReferenceConverterBase&) { }
private:
mutable volatile int32_t mCount;
};
android-5.0.2/frameworks/rs/cpp/util/StrongPointer.h
template
class sp
{
public:
inline sp() : m_ptr(0) { }
sp(T* other);
sp(const sp& other);
template sp(U* other);
template sp(const sp& other);
~sp(); //析构执行代码见下面
// Assignment
sp& operator = (T* other);
sp& operator = (const sp& other);
template sp& operator = (const sp& other);
template sp& operator = (U* other);
//! Special optimization for use by ProcessState (and nobody else).
void force_set(T* other);
// Reset
void clear();
// Accessors
inline T& operator* () const { return *m_ptr; }
inline T* operator-> () const { return m_ptr; }
inline T* get() const { return m_ptr; }
// Operators
COMPARE(==)
COMPARE(!=)
COMPARE(>)
COMPARE(<)
COMPARE(<=)
COMPARE(>=)
private:
template friend class sp;
template friend class wp;
void set_pointer(T* ptr);
T* m_ptr;
};
template
sp::~sp()
{
if (m_ptr) m_ptr->decStrong(this);
}