Android手机操作系统既然是开源的操作系统。那么在具体的文件夹中就会存放着各种相关功能的开源代码。我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能。在这里大家就一起来看看Android智能指针的相关源码解读以及应用方法。

在Android的源代码中,经常会看到形如:sp< xxx>、wp< xxx>这样的类型定义,这其实是Android中的智能指针。智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。在C++编程中,有两个很让人头痛的问题:一是忘记释放动态申请的对象从而造成内存泄露;二是对象在一个地方释放后,又在别的地方被使用,从而引起内存访问错误。

程序员往往需要花费很大精力进行精心设计,以避免这些问题的出现。在使用智能指针后,动态申请的内存将会被自动释放(有点类似Java的垃圾回收),不需要再使用delete来释放对象,也不需要考虑一个对象是否已经在其它地方被释放了,从而使程序编写工作减轻不少,而程序的稳定性大大提高。

Android智能指针相关的源代码在下面两个文件中:

frameworks\base\include\utils\RefBase.h

frameworks\base\libs\utils\RefBase.cpp

Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),一种是弱指针(weak pointer)。其实成为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。要想访问弱指针所指向的对象,需首先将弱指针升级为强指针(通过wp类所提供的promote()方法)。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。

是不是很神奇?弱指针是怎么做到这一点的呢?其实说穿了一点也不复杂,原因就在于每一个可以被智能指针引用的对象都同时被附加了另外一个 weakref_impl类型的对象,这个对象中负责记录对象的强指针引用计数和弱指针引用计数。这个对象是Android智能指针的实现内部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用计数和弱引用计数都为0时,这个对象才会被销毁。

说了这么多原理,下面该看看到底智能指针该怎么使用了。假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:

(1) 这个类是基类RefBase的子类或间接子类;

(2) 这个类必须定义虚构造函数,即它的构造函数需要这样定义:

  1. virtual~MyClass();

满足了上述条件的类就可以定义Android智能指针了,定义方法和普通指针类似。比如普通指针是这样定义:

  1. MyClass*p_obj;

Android智能指针是这样定义:

  1. sp< MyClass>p_obj;

注意不要定义成 sp< MyClass>* p_obj。初学者容易犯这种错误,这样实际上相当于定义了一个指针的指针。尽管在语法上没有问题,但是最好永远不要使用这样的定义。

定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。比如:

  1. p_obj=newMyClass();
  2. //注意不要写成p_obj=newsp< MyClass>
  3. sp< MyClass>p_objp_obj2=p_obj;
  4. p_obj->func();
  5. p_obj=create_obj();
  6. some_func(p_obj);

注意不要试图delete一个Android智能指针,即 delete p_obj。不要担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。不需要再使用一个对象后,直接将指针赋值为NULL即可:

  1. p_obj=NULL;

上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:

  1. wp< MyClass>wp_obj=newMyClass();
  2. p_obj=wp_obj.promote();
  3. //升级为强指针。不过这里要用.而不是->,真是有负其指针之名啊
  4. wp_obj=NULL;

Android智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上普通指针的。所以在对运行效率敏感的地方,最好还是不要使用智能指针为好

Android智能指针SP WP使用方法介绍相关推荐

  1. android wp指针使用方法,Android智能指针RefBase、sp、wp解析

    [TOC] 在Android系统中,Native层的代码基本都是C++写的,C++跟Java不一样,C++没有垃圾回收机制,C++代码中难于管理new出来对象的释放,稍有不慎就造成内存泄漏.针对此问题 ...

  2. Android智能指针

    智能指针的目标   在使用指针的时候容易出现的问题不外乎下面几个.首先,指针在使用之前都必须初始化,这个还算容易解决,在创建指针变量的时候同步初始化就好了:第二个问题就是经常忘记delete,就我的经 ...

  3. android 绘指针,Android智能指针

    "Yeah It's on. " 前言 在Android系统中,Native层的代码基本都是C++写的,C++跟Java不一样,C++没有垃圾回收机制,C++代码中难于管理new出 ...

  4. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升 转载于:https://www.cnblogs.com/jeanschen/p/3507512.html

  5. Android强指针sp和弱指针wp区别

    1.强指针与弱指针概述Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),一种是弱指针(weak pointer). 其实成为强引用和弱引用更合适一些.强指针与一 ...

  6. Android智能指针——读书笔记

    目录结构 目录结构 参考资料 概述 背景知识 GC经典问题 轻量级指针 实现原理分析 构造函数 析构函数 应用实例分析 强指针和弱指针 强指针的实现原理分析 增加对象的弱引用计数 增加对象的强引用计数 ...

  7. Android 智能指针 视频,Android系统智能指针中轻量级指针

    lp.sp.wp在Android Native层中被大量使用,所以非常有必要学习它们的实现原理.lp是Light Pointer的缩写,表示轻量级指针,sp是Strong Pointer的缩写,表示强 ...

  8. C++智能指针shared_ptr的使用方法

    原理 shared_ptr内部使用了引用计数的方式对同一块内存进行引用,对于同一块内存,每多一个对它的指向,所有指针的内部的引用计数就会加一,每减少一个对它的指向,所有指针内部的引用计数就会减一,当引 ...

  9. Android framework RefBase,sp,wp

    文章目录 代码位置 使用例子 简介 RefBase sp模板类 wp模板类 源码实现 RefBase 强引用计数函数:incStrong.decStrong 弱引用计数函数:incWeak.decWe ...

最新文章

  1. openwrt 安装 ser2net 配置
  2. 30岁之前必须明白的道理(你现在知道此生无憾了)
  3. ios 苹果审核常见被拒问题
  4. Gentoo 安装日记 03 (配置网络)
  5. property、staticmethod、classmethod与__str__的用法
  6. ElementUI中el-upload怎样上传文件并且传递额外参数给Springboot后台进行接收
  7. ics计算机系统全称,ICS计算机系统实验--datalab实验
  8. z2屏幕坏如何从计算机导出数据,闪回收-手机屏幕坏了如何导出数据?手机屏幕坏了怎么用电脑控制?...
  9. 黑鲨官网装机大师工具如何重装win10系统,win10系统重装
  10. css字间距 与 Photoshop里字间距关系
  11. java三猴分桃多线程,浅谈数学趣题:三翁垂钓和五猴分桃
  12. 关于JSON的常见问题以及首字母大写的JSON
  13. Web前端 | HTML | 基础
  14. 中国云计算行业发展前景
  15. Oracle 基本SQL语句
  16. 数据脱敏(Data Masking)学习
  17. LSTM案例——动态和可解释的ICU死亡风险预测
  18. 【Machine Learning, Coursera】机器学习Week6 偏斜数据集的处理
  19. 中国银行的海外IT建设之路
  20. java需求设计文档模板下载_设计Java

热门文章

  1. C语言 · 猜算式
  2. [mark] some free templates sites
  3. GitHub更新Fork代码
  4. 太阳升起并下落的小动画-SWIFT
  5. mysql binlog限流问题总结
  6. 在jexus下如何简单的配置多站点
  7. 存储过程清理N天前数据
  8. eclipse的workspace和working set
  9. 独家披露51CTO被黑过程:数据库已小范围流传
  10. 设置时区,时间,日期的脚本