Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Android源码中,理解智能指针的弱引用、强引用、弱指针、强指针的用法与区别。

2.Android之智能指针的弱引用、强引用、弱指针、强指针介绍

  • 在 Android 的 C++ 开发中,弱引用、强引用、弱指针和强指针都是用于管理对象生命周期的工具。
  • 它们是在 Android Framework 中实现的智能指针,用于避免内存泄漏和悬空指针问题。

<1>.强引用 (Strong Reference):

  • 定义:sp(android::sp)是一个智能指针,用于强引用计数对象。当使用 sp 指向一个对象时,对象的引用计数会增加,只有当所有 sp 指针被释放时,对象才会被销毁。
  • 用途:强引用用于确保对象在被引用时不会被销毁,从而避免悬空指针和内存泄漏。
  • 用法:通过 sp 创建一个指向对象的智能指针,当不再需要时,释放指针或者让其超出作用域即可。

<2>.弱引用 (Weak Reference):

  • 定义:wp(android::wp)是一个智能指针,用于弱引用计数对象。与 sp 不同,wp 不会增加对象的引用计数,因此它不会阻止对象被销毁。
  • 用途:弱引用用于检查对象是否仍然存在,但不会影响对象的生命周期。
  • 用法:通过 wp 创建一个指向对象的弱引用指针,可以通过 promote() 方法将弱引用提升为强引用,以检查对象是否仍然存在。

<3>.强指针 (Strong Pointer):

  • 定义:强指针是一个指向对象的原生指针,它通常用于表示强引用。
  • 用途:强指针用于指向需要持久性的对象,但不提供自动内存管理功能,程序员需要手动管理对象的生命周期。
  • 用法:通过创建一个指向对象的指针来使用强指针,需要手动释放内存。

<4>.弱指针 (Weak Pointer):

  • 定义:弱指针是一个指向对象的原生指针,它通常用于表示弱引用。
  • 用途:弱指针用于指向不需要持久性的对象,不影响对象的生命周期。
  • 用法:通过创建一个指向对象的指针来使用弱指针,可以检查对象是否仍然存在。

3.代码实例

<1>.强引用 (Strong Reference)

#include <utils/StrongPointer.h>using namespace android;class MyClass {};int main() {sp<MyClass> strongPtr = new MyClass();  // 创建一个强引用指针// 使用 strongPtr 指向的对象return 0;
}

<2>.弱引用 (Weak Reference)

#include <utils/WeakPointer.h>using namespace android;class MyClass {};int main() {sp<MyClass> strongPtr = new MyClass();  // 创建一个强引用指针wp<MyClass> weakPtr = strongPtr;       // 创建一个弱引用指针,指向相同的对象sp<MyClass> sptr = weakPtr.promote();  // 通过弱引用提升为强引用if (sptr != nullptr) {// 使用 sptr 指向的对象} else {// 对象已被销毁}return 0;
}

4.总结

<1>.强指针 (Strong Pointer):

  • 强指针是指向对象的指针,它会增加对象的引用计数,从而延长对象的生命周期。当有一个或多个强指针指向某个对象时,该对象的引用计数会增加。只有当所有指向该对象的强指针都释放时,对象的引用计数才会减少,从而触发对象的销毁。

<2>.弱指针 (Weak Pointer):

  • 弱指针也是指向对象的指针,但它不会增加对象的引用计数。即使存在一个或多个弱指针指向某个对象,该对象的引用计数也不会增加,因此不会影响对象的生命周期。弱指针主要用于检查对象是否仍然存在,而不影响对象的生命周期。

<3>.强引用 (Strong Reference):

  • 强引用是指对象的直接引用,它会增加对象的引用计数并保持对象的生命周期。
  • 在 C++ 中,通常使用强指针来表示强引用。

<4>.弱引用 (Weak Reference):

  • 弱引用是指对对象的非直接引用,它不会增加对象的引用计数也不会影响对象的生命周期。
  • 在 C++ 中,通常使用弱指针来表示弱引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24双非考研哈尔滨工程大学计算机(@程程笔记)

前言 个人情况&#xff0c;本科双非考研软件工程。24考研成绩总分369(政治75&#xff0c;英语58&#xff0c;数学102&#xff0c;专业课134)&#xff0c;整体各科成绩比较均衡&#xff0c;没有太突出和瘸腿的&#xff0c;初始排名5/19&#xff0c;复试后排名5/13。 政治 政治…

2024年学鸿蒙开发“钱”途无量……

随着科技的不断发展和智能设备的普及&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐渐受到市场的关注。2024年&#xff0c;学鸿蒙开发是否有前途&#xff0c;成为了很多开发者关心的问题。本文将从多个角度分析鸿蒙系统的发展前景&#xff0c;以及学习鸿蒙开…

Python|OpenCV-获取鼠标点击位置的坐标,并绘制图像(13)

前言 本文是该专栏的第14篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 本文主要来详细说明,基于OpenCV来获取鼠标点击位置的坐标,并按坐标的位置进行自动绘制图像。具体怎么实现,笔者在正文中将结合实际代码案例进行详细说明。 具体细节部分以及完整代码的实…

.Linux基础正则表达式字符

^oldboy 以oldboy开头 oldboy$ 以oldboy结尾 ^$ 空行 . 匹配任意单个字符 * 重复前一个字符0或n次 .* 匹配所有 c. 数据准备 #重要说明&#xff1a;Linux基础正则表达式仅适用于grep、sed、awk、egrep(grep -E) [rootoldboyedu ~]# touch file{01..05}.txt [rootoldboyedu ~]#…

linux 迁移home目录以及修改conda中pip的目录

1&#xff09;sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行负责&#xff08;假设机械硬盘挂载在/data目录下&#xff09; 2&#xff09;usermod -d /data/home/lrf -m lrf 修改用户$HOME变量 3&#xff09;vi /etc/passwd 查看对应用户的$HOME变量是否成…

案例图片管理--书架

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>案例图片管理--书架</title> </head…

docker搭建Airsonic

Airsonic 是一个基于网络的媒体流媒体服务器&#xff0c;它主要用于处理和流式传输音频文件。Airsonic 可以作为个人音乐流媒体服务&#xff0c;允许用户从任何支持的客户端设备远程访问其音乐库。 个人音乐流媒体服务&#xff1a; 允许用户构建自己的音乐流媒体服务器&#x…

4.2.k8s的pod-标签管理、镜像拉取策略、容器重启策略、资源限制、优雅终止

一、标签管理 1.标签在k8s中极其重要&#xff0c;大多数资源的相互关联就需要使用标签&#xff1b;也就是说&#xff0c;资源的相互关联大多数时候&#xff0c;是使用标签进行关联的&#xff1b; 2.其他作用&#xff0c;在k8s集群中&#xff0c;node节点的一些操作比如污点及污…

【Linux】UDP编程【下】{三版本服务器/编程常见问题}

文章目录 3.linux网络涉及到的协议栈4.三个版本的服务器4.1响应式4.2命令式4.3交互式1.启动程序2.运行结果 3.linux网络涉及到的协议栈 Linux网络协议栈是一个复杂而强大的系统&#xff0c;它负责处理网络通信的各种细节。下面是对Linux网络协议栈的详细介绍&#xff1a; 套接…

高并发下的linux优化

针对高并发服务&#xff0c;对 Linux 内核和网络进行优化可以提高系统的性能和稳定性。本文将深入探讨如何对 Linux 内核和网络进行优化&#xff0c;包括调整内核参数、调整网络性能参数、使用 TCP/IP 协议栈加速技术、下面将介绍一些可用于优化Linux内核和网络的技术&#xff…

计算机视觉入目要学习哪些东西及就业方向

计算机视觉是人工智能领域的一个重要分支&#xff0c;它涉及使计算机能够从图像或多维数据中理解和解释视觉信息的技术。要学习计算机视觉&#xff0c;你需要掌握以下几个方面的知识和技能&#xff1a; 基础数学知识&#xff1a; 线性代数&#xff1a;矩阵运算、特征值和特征向…

12-2-CSS 字体图标

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 字体图标1 字体图标的产生2 字体图标的优点3 字体图标的下载4 字体图标的…

蓝桥杯算法题:卡片换位

问题描述 你玩过华容道的游戏吗&#xff1f;这是个类似的&#xff0c;但更简单的游戏。 看下面 2 x 3 的格子 --------- | A | * | * | --------- | B | | * | --------- 1 2 3 4 5 在其中放 5 张牌&#xff0c;其中 A 代表关羽&#xff0c;B 代表张飞&#xff0c;* 代表士兵…

CLCD 流水线发布SpringBoot项目

目录 一、流水线 1.1 点击进入流水线 1.2 新建流水线 二、添加流水线 三、构建上传和构建镜像 ​编辑 四、Docker部署 一、流水线 1.1 点击进入流水线 1.2 新建流水线 二、添加流水线 三、构建上传和构建镜像 在构建上传里添加一个步骤&#xff1a;构建镜像&#xff0c;这…

【鸿蒙 HarmonyOS】@ohos.promptAction (弹窗)

一、背景 创建并显示文本提示框、对话框和操作菜单。 文档地址&#x1f449;&#xff1a;文档中心 说明 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 该模块不支持在UIAbility的文件声明处使用&#xff0c;即…

GitHub入门与实践

ISBN: 978-7-115-39409-5 作者&#xff1a;【日】大塚弘记 译者&#xff1a;支鹏浩、刘斌 页数&#xff1a;255页 阅读时间&#xff1a;2023-08-05 推荐指数&#xff1a;★★★★★ 好久之前读完的了&#xff0c;一直没有写笔记。 这本入门Git的书籍还是非常推荐的&#xff0c;…

【使用 PyQt6-第03章】 部件 QPushButton、QCheckBox、QComboBox、QLabel 和 QSlider 小部件

目录 一、说明二、快速演示三、QLabel四、Q复选框五、QComboBox六、QListWidget七、QLine编辑八、QSpinBox 和 QDoubleSpinBox九、Q滑块十、QDial十一、结论 一、说明 部件 QPushButton、QCheckBox、QComboBox、QLabel 和 QSlider 小部件 创建附加窗口&#xff0c;本教程也适…

Golang | Leetcode Golang题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; func longestCommonPrefix(strs []string) string {if len(strs) 0 {return ""}isCommonPrefix : func(length int) bool {str0, count : strs[0][:length], len(strs)for i : 1; i < count; i {if strs[i][:length] ! str0 …

HTTP 摘要认证

文章目录 一、什么是摘要认证二、工作流程三、实例演示 一、什么是摘要认证 摘要认证&#xff0c;即 Digest Access Authentication&#xff0c;是一种HTTP身份验证机制&#xff0c;用于验证用户的身份。相较于基本认证&#xff08;Basic Authentication&#xff09;使用用户名…

Qt之信号和槽的机制

前言 在 C 中&#xff0c;对象与对象之间产生联系要通过调用成员函数的方式。但是在 Qt中&#xff0c;Qt提供了一种新的对象间的通信方式&#xff0c;即信号和槽机制。在GUI编程中&#xff0c;通常希望一个窗口部件的一个状态的变化会被另一个窗口部件知道&#xff0c;为…