android智能指针android::sp使用介绍

embedded/2025/3/3 17:14:32/

android::sp 是 Android 中的智能指针(Smart Pointer)的实现,用于管理对象的生命周期,避免手动管理内存泄漏等问题。它是 Android libutils 库中重要的一部分,常用于管理继承自 android::RefBase 的对象。

与标准库中的 std::shared_ptr 类似,android::sp 是引用计数智能指针。它会在对象的引用计数变为零时自动释放对象。此外,Android 还提供了 wp(弱指针),用于解决循环引用的问题。


sp 的特性

  1. 引用计数管理:基于 android::RefBase 的引用计数,确保对象安全销毁。
  2. 自动释放资源:当没有任何 sp 指针指向一个对象时,自动销毁该对象。
  3. 线程安全spwp 提供线程安全的引用计数操作。

使用场景

sp 通常用于管理继承自 android::RefBase 的对象。在 Android 的 HAL(硬件抽象层)和 Binder 通信中非常广泛。


实现原理

sp 的核心是对目标对象的引用计数进行管理。目标对象必须继承 android::RefBase,因为 RefBase 提供了引用计数的功能。

RefBase 提供了以下方法:

  • incStrong(const void* id):增加强引用计数。
  • decStrong(const void* id):减少强引用计数。
  • getStrongCount():获取当前的强引用计数。

简单示例代码

以下是一个完整的例子,演示如何使用 android::spRefBase

#include <utils/RefBase.h>
#include <utils/Log.h>
#include <iostream>using namespace android;// 一个继承自 RefBase 的类
class MyClass : public RefBase {
public:MyClass() {std::cout << "MyClass Constructor" << std::endl;}~MyClass() {std::cout << "MyClass Destructor" << std::endl;}void display() {std::cout << "Hello from MyClass!" << std::endl;}
};int main() {// 创建智能指针sp<MyClass> sp1 = new MyClass();sp1->display();{// 创建另一个智能指针,引用同一个对象sp<MyClass> sp2 = sp1;std::cout << "sp2 created, reference count: " << sp2->getStrongCount() << std::endl;} // sp2 离开作用域,引用计数减少std::cout << "sp2 out of scope, reference count: " << sp1->getStrongCount() << std::endl;// 离开主作用域,sp1 被销毁,引用计数为 0,对象销毁return 0;
}

输出结果

运行上面的代码,输出类似以下内容:

MyClass Constructor
Hello from MyClass!
sp2 created, reference count: 2
sp2 out of scope, reference count: 1
MyClass Destructor

代码详解

  1. sp<MyClass> sp1 = new MyClass();

    • sp 是一个模板类,sp<MyClass> 表示一个指向 MyClass 的智能指针。
    • 使用 new 创建一个 MyClass 对象,sp1 的构造函数会自动增加引用计数。
  2. sp<MyClass> sp2 = sp1;

    • sp1 赋值给 sp2,它们会共享同一个 MyClass 对象,引用计数增加到 2。
  3. sp2 离开作用域

    • sp2 离开作用域时,析构函数会减少引用计数(调用 decStrong),此时引用计数变为 1。
  4. sp1 离开作用域

    • sp1 离开作用域时,引用计数变为 0,MyClass 对象被销毁(调用析构函数)。

注意事项

  1. 对象必须继承 RefBase

    • sp 的引用计数功能依赖于 RefBase,如果对象没有继承 RefBase,则不能使用 sp
  2. 避免循环引用

    • 如果两个对象互相持有 sp 指针,会导致引用计数永远无法归零,产生内存泄漏。可以使用 wp(弱指针)解决这个问题。

扩展:使用弱指针

如果你需要避免循环引用,可以使用 android::wp(弱指针)。以下是一个简单示例:

#include <utils/RefBase.h>
#include <iostream>using namespace android;class MyClass : public RefBase {
public:MyClass() {std::cout << "MyClass Constructor" << std::endl;}~MyClass() {std::cout << "MyClass Destructor" << std::endl;}void display() {std::cout << "Hello from MyClass!" << std::endl;}
};int main() {sp<MyClass> sp1 = new MyClass();wp<MyClass> wp1 = sp1; // 创建一个弱指针{sp<MyClass> sp2 = wp1.promote(); // 从弱指针提升为强指针if (sp2 != nullptr) {sp2->display();}} // sp2 离开作用域sp1 = nullptr; // 强引用计数归零,对象销毁if (wp1.promote() == nullptr) {std::cout << "Object already destroyed!" << std::endl;}return 0;
}

总结

  • android::sp 是 Android 中的智能指针,用于管理派生自 RefBase 的对象。
  • 它通过引用计数实现内存管理,避免手动 newdelete
  • 使用 sp 时要注意避免循环引用,可以结合 wp 使用。

http://www.ppmy.cn/embedded/169663.html

相关文章

北京大学DeepSeek提示词工程与落地场景(PDF无套路免费下载)

近年来&#xff0c;大模型技术飞速发展&#xff0c;但许多用户发现&#xff1a;即使使用同一款 AI 工具&#xff0c;效果也可能天差地别——有人能用 AI 快速生成精准方案&#xff0c;有人却只能得到笼统回答。这背后的关键差异&#xff0c;在于提示词工程的应用能力。 北京大…

用Python3脚本实现Excel数据到TXT文件的智能转换:自动化办公新姿势

文章目录 用Python3实现Excel数据到TXT文件的智能转换&#xff1a;自动化办公新姿势场景应用&#xff1a;为什么需要这种转换&#xff1f;技术解析&#xff1a;代码实现详解核心代码展示改进点说明 实战演练&#xff1a;从Excel到TXT的完整流程准备数据示例&#xff08;data.xl…

SkyWalking

一、APM系统 APM&#xff08;Application Performance Monitoring&#xff09;即应用程序性能监控系统&#xff0c;是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理&#xff0c;主要指对企业的关键业务应用进行监测、优化&#xff0…

C#委托(delegate)的常用方式

C# 中委托的常用方式&#xff0c;包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);&#xff1a;定义了一个公共委托类型 …

【后端开发面试题】每日 3 题(三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12903849.html &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享后端开发面试中常见的面试题给大家~ ❤️如果有收获的话&#x…

数据库拓展操作

目录 一、截断表&#xff1a; 操作目的&#xff1a; 操作内容&#xff1a; 性能影响&#xff1a; 基本语法&#xff1a; 例子&#xff1a; 二、插入查询结果&#xff1a; 基本语法&#xff1a; 例子&#xff1a; 三、聚合函数&#xff1a; 常用函数&#xff1a; 基…

AI快速变现之路,AI视频创作

以下是针对AI视频创作的快速变现方案,包含详细操作步骤、工具推荐及行业应用案例,结合2025年AIGC技术趋势设计: 一、核心操作流程详解 1. 需求分析与脚本生成 工具推荐:ChatGPT 4.0 + Script Studio(视频脚本专用工具)操作步骤: 通过问卷星收集客户需求(品牌调性/目标…

JAVA【微服务】Spring AI 使用详解

目录 一、前言二、Spring AI 概述2.1 什么是 Spring AI2.2 Spring AI 特点2.3 Spring AI 带来的便利2.4 Spring AI 应用领域2.4.1 聊天模型2.4.2 文本到图像模型2.4.3 音频转文本2.4.4 嵌入大模型使用2.4.5 矢量数据库支持2.4.6 数据工程 ETL 框架三、Spring AI 对接 ChatGPT3.…