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

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

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

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
更多原创,欢迎关注: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)

cpp 复制代码
#include <utils/StrongPointer.h>

using namespace android;

class MyClass {};

int main() {
    sp<MyClass> strongPtr = new MyClass();  // 创建一个强引用指针
    // 使用 strongPtr 指向的对象
    return 0;
}

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

cpp 复制代码
#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++ 中,通常使用弱指针来表示弱引用。
相关推荐
梦想患者13 天前
浅谈智能指针工作原理(std::shared_ptr、std::unique_ptr、std::weak_ptr、std::auto_ptr)
开发语言·c++·智能指针·unique_ptr·shared_ptr·weak_ptr
蜗牛沐雨14 天前
深入理解Rust中的指针:裸指针 && 智能指针
开发语言·后端·rust·智能指针·裸指针
青草地溪水旁1 个月前
std::move小结
c++·智能指针
小丑西瓜6662 个月前
c++智能指针
开发语言·c++·学习·基础语法·智能指针
极客先躯2 个月前
高级java每日一道面试题-2024年9月03日-JVM篇-怎么判断对象是否可以被回收?
java·jvm·面试·弱引用·强引用·软引用·jvm篇
小乌龟不会飞2 个月前
【C++】智能指针——auto_ptr,unique_ptr,shared_ptr
开发语言·c++·智能指针
遨游的laugh哥2 个月前
三种智能指针
c++·智能指针
卡戎-caryon2 个月前
【C++】12.智能指针
数据库·c++·笔记·智能指针
醉颜凉4 个月前
【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用
java·jvm·面试·弱引用·强引用·软引用·虚引用
10km5 个月前
guava:LoadingCache缓存机制支持弱引用(WeakReference)
java·缓存·guava·弱引用·weakreference