Android中的智能指针

本文介绍了Android中智能指针的概念,包括轻量级指针LightRefBase和RefBase的强、弱引用原理。通过分析RefBase类的强弱引用计数机制,展示了如何在C++中解决对象生命周期管理和循环引用问题。
摘要由CSDN通过智能技术生成

对象的维护

在编程中,维护对象的生命周期的方式有两种方式:

  1. 可达性算法
  2. 引用计数算法

Java通过可达性管理对象的生命周期GC可达性实践-内存泄露分析。而C++中由于没有GC的机制,通常使用的是引用计数算法。

简单的引用计数通常是给对象添加一个引用计数器,当有引用时,计数器加1,当引用失效时,引用计数减少1,当计数器为0时,说明可以回收对象了。但是此种方式无法解决循环引用的情况。

如图:
普通计数

A对象引用了B对象,B对象引用了A对象。由于A,B的对象的计数器均不为0,因此永远不会回收A,B对象。

为了解决这个问题,引入了强引用计数和弱引用计数。存在强引用,对象不会回收,但只存在弱引用,对象是可以回收的。对于上面的循环引入强,弱引用,就是下面的情况。

强,弱引用

A强引用B,B弱引用A,由于A只有弱引用,A是可以回收的,一旦A回收,无对象强引用B,B也可以回收了,通过强,弱引用就解决了引用计数算法中的循环引用的问题。

Android中的智能指针

Android为C++提供了三种智能指针

  • 轻量级指针(sp,LightRefBase),使用简单的引用计数,也就是只有强引用计数。
  • 强引用指针(sp,RefBase),使用强引用计数
  • 弱引用指针(wp,RefBase),使用弱引用计数

轻量级指针 - LightRefBase

LightRefBase

需要使用轻量级指针的类继承LightRefBase就可以了。LightRefBase是一个模板类,仅仅实现了简单的引用计数逻辑。

  • mCount计数器
  • incStrong添加强引用计数的方法
  • decStrong减少强应用计数的方法,并且在计数器为0时,删除对象。
class LightClass : public LightRefBase<LightClass> {
   
};

LightClass简单继承LightRefBase

然后通过sp来完成引用计数。

sp

int main(int argc, char** argv)
{
        LightClass* pLightClass = new LightClass();
        sp<LightClass> lpOut = pLightClass;
        printf("Light Ref Count: %d.\n", pLightClass->getStrongCount());
        {
                sp<LightClass> lpInner = lpOut;
                printf("Light Ref Count: %d.\n", pLightClass->getStrongCount());
        }
        printf("Light Ref Count: %d.\n", pLightClass->getStrongCount());
        return 0;
}

sp类比较简单,强引用计数的操作是在构造方法和析构方法中。

sp<T>::sp(T* other)
        : m_ptr(other) {
    if (other)
        other->incStrong(this);
}

构造方法中初始化m_ptr为传递的对象,并调用传递的对象的incStrong方法来添加强引用计数。也是我们传递的LightRefBase的子类。

sp<T>::~sp() {
    if (m_ptr)
        m_ptr->decStrong(this);
}

析构方法中调用incStrong来较少强引用计数。

基本交互图:

LightRefBase-sp

强引用,弱引用原理

强弱引用的原理是三个重要的类

  • RefBase : 实现了强引用,弱引用计数
  • wp : 弱引用指针
  • sp:强引用指针

RefBase实现了强引用,弱引用计数,要分析强引用,弱

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值