• Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)


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

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

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

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

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:解决Android12之强弱智能指针sp/wp循环引用死锁问题.

    Android中的智能指针包括强引用(Strong Reference)智能指针(sp)和弱引用(Weak Reference)智能指针(wp)。它们都是为了更方便地管理对象的生命周期而引入的。

    1. 强引用智能指针(sp):
      强引用智能指针是一种强引用计数指针,用于管理对象的生命周期。当一个对象被一个sp指针持有时,该对象的引用计数会增加。只有当所有sp指针都释放时,对象才会被销毁。强引用智能指针通过重载了对象的拷贝构造函数、赋值操作符和析构函数来实现引用计数的管理。

    2. 弱引用智能指针(wp):
      弱引用智能指针是一种弱引用计数指针,用于解决对象间的循环引用问题。与强引用智能指针不同,弱引用智能指针不会增加对象的引用计数。弱引用智能指针允许你持有一个对象的弱引用,并且在对象被销毁后自动变为null。当需要使用对象时,可以通过wp提供的方法来尝试获取对象的强引用。

    • 在Android中,强引用智能指针(sp)和弱引用智能指针(wp)是通过android::spandroid::wp来实现的,它们是Android Framework中的类型。

    • 使用智能指针可以有效地管理对象的生命周期,并解决循环引用问题。当程序不再需要引用对象时,强引用会在引用计数变为0时自动释放对象。而弱引用则提供了一种获取对象的方式,即使对象在强引用计数变为0时已经被销毁。

    • 强引用智能指针(sp)用于持有对象的强引用,管理对象生命周期并自动释放对象;弱引用智能指针(wp)用于解决循环引用问题,允许获取对象的强引用,并在对象释放后自动置为null。这样可以更方便地管理和使用Android中的对象。

    2.调试实例

    <1>.sp和sp引用同一个类对象,造成死锁,无法调用析勾函数释放内存和引用数量。

    /***********************************************************
    * Author        : 公众号: Android系统攻城狮
    * Create time   : 2023-09-20 00:05:13 星期三
    * Filename      : lightpointer.cpp
    * Description   : sp和sp智能指针相互引用导致的死锁问题.
    ************************************************************/
    #include 
    #include 
    #include 
    
    using namespace android;
    using namespace std;
    
    
    class ClassB;
    
    class ClassA : public RefBase {
       
    public:
      ClassA() {
       
        cout << "ClassA Constructor" << endl;
      }
    
      ~ClassA() {
       
        cout << "ClassA Destructor" << endl;
        printf("xxx----------> line = %d, count = %d\n",__LINE__,this->getStrongCount());
      }
    
      void setClassA(sp<ClassA> obj) {
       
        mClassA = obj;
      }
    
    private:
      sp<ClassA> mClassA;
    };
    
    int main() {
       
    
      //v1.0
      sp<ClassA> objA = new ClassA;
      sp<ClassA> sp1(objA);
      sp1->setClassA(objA);
    
      
      printf("xxx----------> line = %d, count = %d\n",__LINE__
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    论文文献管理工具——Zotero
    springboot医疗管理系统毕业设计源码015221
    【运维知识高级篇】超详细的Jenkins教程4(参数化构建+脚本传参+代码秒级发布+秒级回滚)
    gitlab删除project
    Jmeter压测——BlazeMeter录制脚本+Jmeter进行测试
    点餐项目实现
    Leetcode每日刷题之 283. 移动零(C++)
    docker 构建filebeat镜像
    lintcode 3605 · 二维网格偏移 【数组相关,模拟即可】
    生物医药企业全域数据治理实践 | 爱分析研讨会
  • 原文地址:https://blog.csdn.net/u010164190/article/details/133054088