android智能指針android::sp使用介紹

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.pswp.cn/diannao/72081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72081.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring整合mybatis詳細步驟

spring整合mybatis的全部過程(整合方式一 &#xff1a;簡單版) 1.在pom.xml中導入mybatis相應的jar包&#xff1a; (2) < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.5.3&…

2025年Linux主力系統選擇指南:基于最新生態的深度解析(附2025年發行版對比速查表)

Linux發行版生態在2025年持續演進&#xff0c;既有經典系統的迭代升級&#xff0c;也有新興項目的崛起。本文結合最新行業動態&#xff0c;從個人用戶到企業場景&#xff0c;梳理主力系統選擇策略&#xff0c;助你找到最適合的Linux發行版。 一、新手友好型&#xff1a;平滑過渡…

ai-2、機器學習之線性回歸

機器學習之線性回歸 1、機器學習2、線性回歸2.1、梯度下降法 3、python下調用scikit-learn 1、機器學習 2、線性回歸 ####所以y可以當成我們需要的結果&#xff0c;根據公式可以求的y一撇的值更小&#xff0c;所以更接近需要的結果&#xff0c;所以y一撇擬合性更好 2.1、梯度下…

Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存

Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存 目錄 Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存 一、簡單介紹 二、簡單介紹 camera 三、安裝 camera 四、簡單案例實現 五、關鍵代碼 一、簡單…

【原創】Open WebUI 本地部署

使用官網的默認部署&#xff0c;遇到不少的問題。比如白屏問題&#xff0c;其實需要修改幾個參數即可。 其實在部署的時候有不少參數 WEBUI_AUTH False ENABLE_OPENAI_API 0 PATH /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LANG C.UTF-8…

【造個輪子】使用Golang實現簡易令牌桶算法

本文目錄 1. 令牌桶算法2. 調用第三方庫實現令牌桶3. 手撕令牌桶 前言&#xff1a;之前在Bluebell社區項目中&#xff0c;我們使用了開源的庫來實現令牌桶限流&#xff0c;這次我們試著使用Go來手撕實現下令牌桶算法。 1. 令牌桶算法 為了防止網絡擁塞&#xff0c;需要限制流…

C#開發的Base64編碼及解碼完整源碼及注意事項

在軟件開發時&#xff0c;經常用Base64編碼和解碼功能。本文介紹一個簡單易用的Base64 編碼和解碼工具&#xff0c;顧名思義&#xff0c;就是簡單快捷地進行 Base64 代碼的解碼或編碼操作。您的數據可以輕松地編碼為 Base64 編碼&#xff0c;也可以解碼為可讀的格式。傳輸數據時…

【Linux第一彈】Linux基礎指令(上)

目錄 1.ls指令 1.1 ls使用實例 2.pwd指令 3.cd指令 3.1 cd使用實例 4.touch指令 4.1touch使用實例 5.mkdir指令 5.1mkdir使用實例 6.rmdir指令和rm指令 6.1 rmdir指令使用實例->: 6.2 rm指令使用實例 7.man指令 8.cp指令 8.1 cp 使用實例 9.mv指令 9.1mv使用…

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客戶端與 RabbitMQ 服務器通信的虛擬會話通道&#xff0c;其核心作用在于優化資源利用并提升消息處理效率。以下是其核心機制與功能的詳細解析&#xff1a; 一、Channel 的核心定義 虛擬通信鏈路 Channel 是建立在 TCP 連…

Zookeeper(80)Zookeeper的常見問題有哪些?

Zookeeper作為分布式系統的協調服務&#xff0c;常見的問題主要集中在配置、性能、連接管理、數據一致性和節點故障等方面。以下是一些常見問題及其詳細解決方法和代碼示例。 1. 配置問題 問題描述 配置不當可能導致 Zookeeper 集群無法正常啟動或運行效率低下。 解決方法 …

如何管理路由器

一、管理路由器的必要性 1、需要修改撥號上網的密碼。 2、需要修改WIFI的SSID名字和密碼。 3、設置DHCP協議信息。 4、設置IP地址的過濾規則。 5、給某個設備連接設置網絡限速。 二、常見的方式 (一)web網頁方式 1、計算機用雙絞線或者WIFI的方式連接路由器。 2、在計算機中打開…

linux vim 撤銷 回退操作

在Linux的vim編輯器中&#xff0c;撤銷和回退操作是非常基本的&#xff0c;但它們可以通過不同的方式實現&#xff0c;具體取決于你想要的精確效果。下面是一些常用的方法&#xff1a; 1. 撤銷&#xff08;Undo&#xff09; 單個撤銷&#xff1a; 你可以通過按下u鍵來撤銷上一…

淺談流媒體協議以及視頻編解碼

流媒體協議介紹 流媒體協議用于傳輸視頻、音頻等多媒體數據&#xff0c;確保數據流暢地傳輸到用戶設備。常見的流媒體協議包括 RTMP、HLS、DASH、WebRTC 等&#xff0c;每種協議具有不同的特點和適用場景。 1. RTMP (Real-Time Messaging Protocol) 定義&#xff1a;由 Adob…

AF3 DataPipeline類process_multiseq_fasta 方法解讀

AlphaFold3 data_pipeline 模塊DataPipeline類的 process_multiseq_fasta 方法用于處理多序列 FASTA 文件,生成 AlphaFold3 結構預測所需的特征,適用于多鏈復合物的預測。它結合了 Minkyung Baek 在 Twitter 上提出的“AlphaFold-Gap”策略,即通過在多鏈 MSA 中插入固定長度…

圖片爬取案例

修改前的代碼 但是總顯示“失敗” 原因是 修改之后的代碼 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

使用自動化運維工具 Ansible 集中化管理服務器

一、概述 Ansible 是一款為類 Unix 系統開發的自由開源的配置和自動化工具 官方網站:https://www.ansible.com/ Ansible 成立于 2013 年,總部設在北卡羅來納州達勒姆,聯合創始人 ad Ziouani 和高級副總裁 Todd Barr都是紅帽的老員工。Ansible 旗下的開源軟件 Ansible 十分…

CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析

胡未滅&#xff0c;鬢已秋&#xff0c;淚空流 此生誰料 心在天山 身老滄州 ——訴衷情 完整代碼見&#xff1a; SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determinati…

P1706 全排列問題

題目描述 按照字典序輸出自然數 1 到 n 所有不重復的排列&#xff0c;即 n 的全排列&#xff0c;要求所產生的任一數字序列中不允許出現重復的數字。 輸入格式 一個整數 n。 輸出格式 由 1~n 組成的所有不重復的數字序列&#xff0c;每行一個序列。 每個數字保留 5 個場寬。…

會話與會話管理:Cookie與Session的深度解析

一、什么是會話&#xff1f; 二、Cookie&#xff1a;客戶端存儲技術 1. Cookie的工作原理 2、在后端設置cookie 3、在前端設置cookie 三、瀏覽器開啟了cookie禁用怎么辦&#xff1f; 一、什么是會話&#xff1f; 會話&#xff08;Session&#xff09;是指一個用戶與服務器之間…

【Linux系統】—— 馮諾依曼體系結構與操作系統初理解

【Linux系統】—— 馮諾依曼體系結構與操作系統初理解 1 馮諾依曼體系結構1.1 基本概念理解1.2 CPU只和內存打交道1.3 為什么馮諾依曼是這種結構1.4 理解數據流動 2 操作系統2.1 什么是操作系統2.2 設計OS的目的2.3 操作系統小知識點2.4 如何理解"管理"2.5 系統調用和…