zoukankan      html  css  js  c++  java
  • android RefBase、sp、wp

    首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似
    这个类中存在一个私有成员:
    weakref_impl* const mRefs;(weakref_impl是weakref_type的子类)
    这个mRefs是“影子对象”,是管理一个对象的引用计数的关键
    RefBase的构造中mRefs(new weakref_impl(this)),new一个weakref_impl对象,weakref_impl的构造形参是RefBase的指针
    同时会初始化weakref_impl的mStrongmWeak这两个成员,这两个就是关键的强引用计数和弱引用计数
    /********************RefBase的使用和原理其实很简单*****************************/
     
    接下来看看sp和wp(4.4及更高版本的源码中,sp不在RefBase中了,是放在StrongPointer的文件中)
    wp:
    template<typename T>
    wp<T>::wp(T* other)
        : m_ptr(other) //wp<A>中使用m_ptr指向实际的对象
    {
        if (other) m_refs = other->createWeak(this); //m_ref是一个RefBase中的weakref_type的对象,可以看出是将实际对象的影子对象加工处理之后再传给wp的成员的,也就是说wp握有一个实际对象的影子对象
    }
    wp是一个模板类,wp<A> wpA(pA);当然其构造函数有很多还可以用sp<A>来构造
     other->createWeak(this);会调到RefBase的createWeak,然后调用影子对象mRefs的增加弱引用计数
    wp的析构函数:
    template<typename T>
    wp<T>::~wp()
    {
        if (m_ptr) m_refs->decWeak(this);
    }
    在wp析构的过程中,回去调用实际对象的影子对象的弱引用自减,自减过后,弱引用会判断当前的引用计数,如果为0,则调用自身的析构,释放内存
     
    sp与wp类似
    但是sp内部仅有指向实际对象的指针的成员(但有指向实际对象的指针也能够找到影子对象)
    构造过程中会找到实际对象的影子对象,然后将影子对象的强引用和弱引用都自加
    然后值析构的过程中分两步走:
    1.首先减少影子对象的强引用计数,这时判断如果强引用计数为0的话则析构实际数据本身
    2.再减少影子对象的弱引用计数,然后但弱引用计数为0的话就将影子对象释放
     
    这种弱指针和强指针在android系统中起到的作用:就是用这个代替传统的指针,让代码中自行管理对象的内存释放,避免人工造成的内存泄露
    项目中用过
    pA = new A();
    sp<A> spA = pA;
    sp<A> spA(pA);
    这里就重载了等号操作符
    重载操作符是为了让这些操作符更加适用于更多的类类型
    template<typename T>
    sp<T>& sp<T>::operator = (T* other)
    {
        if (other) other->incStrong(this); //this的含义是类中函数的一个隐含参数,指向该类本身,这里就是指向sp<T>
        if (m_ptr) m_ptr->decStrong(this); //空构造mptr初始化0
        m_ptr = other;
        return *this;
    }
  • 相关阅读:
    arm SecurCore 处理器【转】
    ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57【转】
    arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的【转】
    platform型设备在/dev目录下自动创建设备节点的分析【转】
    linux下bus、devices和platform的基础模型 【转】
    kernel 中 sscanf和sprintf()函数使用说明【转】
    Linux内核中的printf实现【转】
    sprintf,snprintf的用法(可以作为linux中itoa函数的补充)【转】
    Linux设备模型(3)_Uevent【转】
    Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】
  • 原文地址:https://www.cnblogs.com/ideawu1001/p/4288299.html
Copyright © 2011-2022 走看看