Android智能指针学习笔记

原创 2013年12月03日 15:13:34

1.强指针支持指向两种超类型的引用对象,一种是轻量级引用对象,继承自LightRefBase,另一种姑且称之为重量级引用对象,继承自RefBase。

2.弱指针只支持指向重量级引用对象,继承自RefBase。

3.引用对象负责维护自己的引用计数,但引用计数器增加或减少的消息由sp或是wp智能指针对象发送。

4.LightRefBase和RefBase维护引用计数的方式不相同,前者直接使用int型变量维护,或者使用一个嵌套类weakref_type维护。

5.引用对象可以设置自己的生存模式,生存模式有三种,strong,weak,forever。不同的生存模式影响他们在内存中的状态。

6.弱指针无法直接访问对象,需要promote成强指针,但并不一定保证成功。

class RefBase
{
public:
            void            incStrong(const void* id) const;
            void            decStrong(const void* id) const;
    
            void            forceIncStrong(const void* id) const;

            //! DEBUGGING ONLY: Get current strong ref count.
            int32_t         getStrongCount() const;

    class weakref_type
    {
    public:
        RefBase*            refBase() const;
        
        void                incWeak(const void* id);
        void                decWeak(const void* id);
        
        // acquires a strong reference if there is already one.
        bool                attemptIncStrong(const void* id);
        
        // acquires a weak reference if there is already one.
        // This is not always safe. see ProcessState.cpp and BpBinder.cpp
        // for proper use.
        bool                attemptIncWeak(const void* id);

        //! DEBUGGING ONLY: Get current weak ref count.
        int32_t             getWeakCount() const;

        //! DEBUGGING ONLY: Print references held on object.
        void                printRefs() const;

        //! DEBUGGING ONLY: Enable tracking for this object.
        // enable -- enable/disable tracking
        // retain -- when tracking is enable, if true, then we save a stack trace
        //           for each reference and dereference; when retain == false, we
        //           match up references and dereferences and keep only the 
        //           outstanding ones.
        
        void                trackMe(bool enable, bool retain);
    };
    
            weakref_type*   createWeak(const void* id) const;
            
            weakref_type*   getWeakRefs() const;

            //! DEBUGGING ONLY: Print references held on object.
    inline  void            printRefs() const { getWeakRefs()->printRefs(); }

            //! DEBUGGING ONLY: Enable tracking of object.
    inline  void            trackMe(bool enable, bool retain)
    { 
        getWeakRefs()->trackMe(enable, retain); 
    }

    typedef RefBase basetype;

protected:
                            RefBase();
    virtual                 ~RefBase();

    //! Flags for extendObjectLifetime()
    enum {
        OBJECT_LIFETIME_STRONG  = 0x0000,
        OBJECT_LIFETIME_WEAK    = 0x0001,
        OBJECT_LIFETIME_MASK    = 0x0001
    };
    
            void            extendObjectLifetime(int32_t mode);
            
    //! Flags for onIncStrongAttempted()
    enum {
        FIRST_INC_STRONG = 0x0001
    };
    
    virtual void            onFirstRef();
    virtual void            onLastStrongRef(const void* id);
    virtual bool            onIncStrongAttempted(uint32_t flags, const void* id);
    virtual void            onLastWeakRef(const void* id);

private:
    friend class ReferenceMover;
    static void moveReferences(void* d, void const* s, size_t n,
            const ReferenceConverterBase& caster);

private:
    friend class weakref_type;
 7.C++标准规定嵌套类没有权限访问外部类私有成员,所以我们需要将嵌套类声明为friend。但是很多编译器都违反标准规定,嵌套类可以访问外部类的私有成员,实现行为不确定。
    class weakref_impl;
    
            RefBase(const RefBase& o);
            RefBase&  operator=(const RefBase& o);

        weakref_impl* const mRefs;
};

8.更多内容请参考老罗博客


人工智能学习笔记(一):简述人工智能的应用领域

一、人工智能的应用领域     1.博弈      状态空间搜索的大多数早期研究都是针对常见的棋盘游戏来实现的,例如夕阳淘气,国际象棋等。      博弈过程中可能产生惊人庞大的搜索空间,需要强大的技...
  • sinat_33397120
  • sinat_33397120
  • 2016年03月05日 15:52
  • 1476

智能社JavaScript学习笔记——JS运动基础

1. 运动基础让Div运动起来 Document #div1{width: 200px; height: 200px; background: red;...
  • namei33
  • namei33
  • 2015年06月09日 03:44
  • 1336

人工智能时代的工作、学习和生活---《人工智能》阅读笔记

人工智能时代的工作与学习---《人工智能》阅读笔记。
  • zhouzxi
  • zhouzxi
  • 2017年07月15日 23:48
  • 1880

c++学习笔记—动态内存与智能指针浅析

我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁。 栈内存用来保存定义在函数内部的非st...
  • xujian_2014
  • xujian_2014
  • 2015年01月08日 15:45
  • 719

C++学习笔记之智能指针

引言众所周知,C++中最让程序员头疼的就是关于内存的问题,其中不外乎以下几点: 1. 缓冲区溢出 2. 野指针 3. 重复释放内存 4. 不配对的new/delete 5. 内存泄露 其中...
  • LYH66
  • LYH66
  • 2015年03月18日 15:45
  • 530

学习笔记三:boost智能指针:scoped_ptr和shared_ptr

笔记,而非知识整理,仅供个人参考。当然如果能给其他同学帮助那就更好。...
  • tingyue_
  • tingyue_
  • 2015年06月28日 15:54
  • 530

c++ 模板学习笔记:类模板模拟auto_ptr智能指针(权哥)

之前转载了一篇文章:auto_ptr详解>> 地址:http://blog.csdn.net/shawvichan/article/details/16959475 为了帮助理解其工作原理,此处自...
  • u011493704
  • u011493704
  • 2013年11月26日 10:57
  • 881

OSG学习笔记1——智能指针

// osgStudy4_19.cpp : 定义控制台应用程序的入口点。 //智能指针对场景的引用计数,看到这里的时候几乎就想放弃了,智能指针什么鬼,在大神的鼓励下,要搞科研的人怎么能不学会钻研呢!...
  • u011310341
  • u011310341
  • 2016年04月20日 09:58
  • 491

C++学习笔记--数组类模板、智能指针模板、单例类模板

上一节中讲到类模板,本节就针对类模板常用的例子来强化类模板。 数组类模板 前面讲过类模板的泛指类型参数,在模板参数中除了类型参数还有一种数值型参数,数值型参数也有他自身的限制: 变量不能作为模板参数,...
  • tqs_1220
  • tqs_1220
  • 2017年12月09日 21:13
  • 39

Binder学习笔记(十一)—— 智能指针

轻量级指针Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见。打开framework...
  • zchongr
  • zchongr
  • 2016年06月13日 00:58
  • 3601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android智能指针学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)