Android系统源码分析之智能指针

本文探讨了Android系统中C++智能指针的应用,包括轻量级指针、强指针和弱指针,旨在解决传统指针导致的内存泄漏及逻辑错误等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统源码分析之智能指针

在Android系统的应用程序框架层中,相当一部分代码是使用C++写的,而C++编写代码最容易出错的地方就是指针了,具体表现:
一、忘记释放指针指向的对象所占用的内存
二、使用了无效指针
C++指针使用不当,轻则造成内存泄漏,重则造成莫名其妙的逻辑错误,甚至系统奔溃。
但是出于性能的考虑,Android系统的应用程序框架层不得不使用C++来开发。Android系统为我们提供了C++智能指针,避免出现指针使用不当的问题。

通常引用计数技术来维护对象的生命周期,每当有一个新的指针指向了一个对象时,这个对象的引用技术就+1,相反则-1;那当引用计数为0,则占用的内存就可以安全释放了。那么这种对象引用计数技术的核心问题是由谁来维护对象的引用计数?
图1
智能指针正是一种能够自动维护对象引用计数的技术。
注意:智能指针是一个对象,而不是一个指针,但是它引用了一个实际使用的对象,正因为它是一个对象,因此它能够自动地维护实际使用对象的引用计数。
实现:在智能指针构造时,增加它所引用的对象的引用计数;而在智能指针析构时,就减少它所引用的对象的引用计数。由于智能指针的构造和析构都是自动的,因此就实现了自动的对象引用计数技术。

以上是一种简单的对象引用计数技术,它存在缺陷,如下:
在这里插入图片描述

以上场景,当A对象不再被使用时,就可以释放它所占用的内存,但由于B仍然引用了A,此时A就不能被释放,同理可得B也是如此;问题来了,对象A等待对象B被释放,对象B也在等待对象A被释放,除非能同时知道对象A和对象B都不在被使用,这个问题才能解决;然而系统是不知道对象之间的依赖关系的,即无法知道两个对象是否同时不再使用。这个问题也是Garbage Collection系统所遇到的经典问题之一,因此它一次只能手机一个对象所占用的内存。

针对上面这个典型问题,于是采用另外一种稍微复杂的引用计数技术来维护对象的生命周期。这种引用计数技术将对象的引用计数分为强引用计数和弱引用计数两种,其中,对象的生命周期只受强引用计数控制,将关联的对象划分为“父-子"和“子-父”关系。

如上图经典问题,假如对象A和对象B是”父-子“关系,那么对象B和对象A就是”子-父“关系,对象A通过强引用计数来引用对象B,对象B通过弱引用计数来引用对象A;当对象A不在被使用时,由于对象B是通过弱引用来引用A,则A的生命周期不受B的影响,则对象A可以完全释放,此时对象A对B的强引用也会释放,那当B不在被使用时,也可以完全释放;

由于B对A是弱引用,当B想使用A时,A可能被释放了,于是B需要将它对A的弱引用计数升级成强引用计数,才能去使用它。如果对象B不能将对A的弱引用计数升级,那说明A已经被释放了,此时B不能再使用A;

Android系统提供了三种类型的C++智能指针,分别为轻量级指针,强指针,弱指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值