1原理

Android中定义了两种智能指针类型,一种是强指针spstrong pointer),另外一种是弱指针(weak pointer)。

其实称之为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

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

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

2 使用

说了这么多原理,下面该看看智能指针该如何使用了。

假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,

那么这个类需满足下列两个前提条件

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

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

virtual ~MyClass();

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

MyClass* p_obj;

智能指针是这样定义:

sp<MyClass> p_obj;

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

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

p_obj = new MyClass(); // 注意不要写成 p_obj = new sp<MyClass> 
sp<MyClass> p_obj2 = p_obj; 
p_obj->func(); 
p_obj = create_obj(); 
some_func(p_obj);

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

p_obj = NULL;

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

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

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

ref:
http://blog.csdn.net/lksodit_yiyi/article/details/8086209

android 的 sp 智能指针用法介绍 sp wp相关推荐

  1. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  2. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  3. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

  4. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    Android系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本文 ...

  5. c++智能指针用法详解

    随笔 - 209   文章 - 2   评论 - 174 c++ 智能指针用法详解 本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_p ...

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

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

  7. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...

    提供引用计数器的类RefBase我们就暂时介绍到这里,后面我们再结合智能指针类一起分析,现在先来看看强指针类和弱指针类的定义.强指针类的定义我们在前面介绍轻量级指针的时候已经见到了,就是sp类了,这里 ...

  8. android 指针是什么意思,Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...

    提供引用计数器的类RefBase我们就暂时介绍到这里,后面我们再结合智能指针类一起分析,现在先来看看强指针类和弱指针类的定义.强指针类的定义我们在前面介绍轻量级指针的时候已经见到了,就是sp类了,这里 ...

  9. c++ 智能指针用法详解

    http://www.cnblogs.com/TenosDoIt/p/3456704.html 本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, un ...

最新文章

  1. R语言ggplot2可视化分组变量下的数据分布(线条、色彩配置)、WVPlots包的ShadowHist函数比较分组下的数据直方图、ggplot2分面图facet_wrap可视化分组变量下的数据分布
  2. 基于 EntityFramework 的数据库主从读写分离架构(2)- 改进配置和添加事务支持...
  3. 三层交换机不能完全取代路由的作用
  4. node-webkit File Dialog
  5. sklearn 中的preprocessing数据预处理
  6. 微盟数据库的涅槃之旅
  7. 天正多条线段长度lisp下载_四年级数学上册基础题过关检测+12套思维题,下载给孩子测试!【有电子版】...
  8. 调用存储过程时报错:Illegal mix of collations
  9. GDKOI2014 石油储备计划
  10. 华为荣耀7i刷linux,华为荣耀7i卡刷教程_荣耀7i用第三方recovery刷机教程
  11. 国密算法c语言实现,求 国密sm2 算法 第四部分 公钥加密算法 c语言实现代码,该怎么解决...
  12. 一个小想法--理解指针的机制与汇编中的寄存器间接寻址
  13. 北大青鸟 当当网网 js 上机作业
  14. 有哪些因素会淘宝的宝贝突然没有流量?
  15. 音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)
  16. 在线视频云会议服务商多维度比较推荐
  17. DPDK and XDP and ebpf
  18. win8.1自带防火墙如何阻止程序联网
  19. 计算机基础模板,计算机基础理论B试卷-模板
  20. Java网络编程——Socket 编程

热门文章

  1. c语言 字符去重复以及冒泡排序
  2. Git 的安装及配置
  3. 大数据 Hive spark Flink 关系
  4. selenium, firefox, python环境搭建指南
  5. 学编程面试通不过_我从编程面试中学到了什么
  6. ubuntu18.04安裝搜狗輸入法
  7. CMakeLists.txt使用boost库
  8. python开发环境的搭建和设置
  9. Hive ETL 任务调优(参数篇)
  10. 【CCF】201903-1小中大