【UE教程/進階】UE中的指針與引用

目錄

  • 直接屬性引用
  • 共享指針 TSharedPtr
    • 實現原理
  • 共享引用 TSharedRef
  • 弱引用指針 TWeakPtr
  • Object弱指針 FWeakPtr
    • 實現原理
  • Object軟指針 FSoftObjectPtr
    • 原理


直接屬性引用

在c++通過UPROPERTY()宏將屬性公開,藍圖中屬性類型中的Object Reference

  • 對一個類型及其子類型的引用:
    • 在c++中: TSubclassOf< TypeName >,指定派生自TypeName的子類型。
    • 在藍圖中:即屬性類型中的Class Reference

# 裸指針
類型* 指針名,只保存對象地址

懸掛指針問題
當指針指向的內存被釋放時,指針仍保持該地址(不為nullptr),此時程序訪問指針就會導致錯誤,導致懸掛指針問題。此時可以使用共享指針TSharedPtr以解決問題。


共享指針 TSharedPtr

TSharedPtr通過引用計數解決懸掛指針問題。

實現原理

  • TSharedPtr中保存著指向對象的裸指針和引用計數器 FReferenceControllerBase* ReferenceController
  • TSharedPtr運用了RAII資源獲取即初始化的思想(Resource Acquisition Is Initialization),在指針的構造函數中增加ReferenceController中的共享引用計數,在析構函數中減少計數,當計數為0時,計數器ReferenceController釋放指向的對象并釋放所有弱引用WeakReference。

循環引用問題
當兩個共享指針相互指向時,兩者的計數都最少是1,并且兩個指針指向的對象都不會被釋放。此時需要和弱指針TWeakPtr一起使用以解決問題

共享引用 TSharedRef

TSharedRef和TSharedPtr的關系就像引用與指針的關系,TSharedRef幾乎所有操作都和TSharedPtr相同。
TSharedRef必須在聲明時初始化,但不能像引用那樣使用“ . ”操作符,TSharedRef必須使用“ -> ”操作符
TSharedPtr可以使用ToSharedRef() 方法轉換為TSharedRef。


弱引用指針 TWeakPtr

  • TWeakPtr解決了TSharedPtr的循環引用問題。
  • TWeakPtr幾乎和TSharedPtr相同,但TWeakPtr增加或減少的計數是弱引用計數WeakReferenceCount,和TSharedPtr的計數分開計算引用次數。
  • 在TWeakPtr計數為0時,會刪除計數器ReferenceController。

Object弱指針 FWeakPtr

FWeakObjectPtr是指向UObject對象的弱指針,其不會干涉UObject對象的GC(垃圾回收),而是在該UObject對象未被GC時返回該原對象,在*被GC后返回nullptr

  • 弱引用不會增加UObject對象的引用計數,不會阻止其GC,只監控其狀態,在其被GC時自動失效置空。

實現原理

弱引用提供Get()函數來獲取其指向的UObject對象,該函數中調用 Internal_Get()。Internal_Get()中調用 Internal_GetObjectItem() ,判斷對象有效性、根據有效性返回對象或nullptr。

TBD


Object軟指針 FSoftObjectPtr

FSoftObjectPtr是指向UObject對象的弱指針,通過間接機制引用對象(如記錄對象在磁盤上的路徑)
其可以安全地檢查資源是否已加載,當引用的對象加載或卸載時,它會在**有效(Valid)掛起(Pending)**之間切換狀態。

  • 有效(Valid):這意味這其指向了一個真實的UObject對象,并且該UObject已經加載到了內存上。此時可以使用Get()函數獲取此UObject。
  • 掛起(Pending):這意味著指向的UObject尚未完全加載到內存中。可以使用 IsPending() 函數獲取指向的UObject是否加載完畢。
  • 軟引用指針的狀態會隨著指向的對象的加載情況而動態切換
    • 當其創建或重新指向一個UObjcet時,狀態可能會是掛起,因為UObject可能需要進行異步加載。
    • 當加載完成后,狀態會從掛起切換為有效,表示指向的UObject已經可以正常訪問。
    • 如果指向的UObject被卸載或銷毀,弱引用指針的狀態會切換回掛起,表示UObject已經不再有效。

原理

TBD


正春華枝俏,待秋實果茂,愿與君共勉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88798.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88798.shtml

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

相關文章

早期 CNN 的經典模型—卷積神經網絡(LeNet)

目錄 LeNet 的設計背景與目標 LeNet 的網絡結構&#xff08;經典 LeNet-5&#xff09; 局部感受野詳解 一、局部感受野和全連接網絡的區別 1. 傳統全連接網絡的問題 2. 局部感受野的解決方案 二、局部感受野的優勢 1. 參數大幅減少 2. 提取局部特征 3. 平移不變性 參數…

RabbitMQ 高級特性之延遲隊列

1. 簡介 在某些場景下&#xff0c;當生產者發送消息后&#xff0c;可能不需要讓消費者立即接收到&#xff0c;而是讓消息延遲一段時間后再發送給消費者。 2. 實現方式 2.1 TTL 死信隊列 給消息設置過期時間后&#xff0c;若消息在這段時間內沒有被消費&#xff0c;就會將消…

uniapp app安卓下載文件 圖片 doc xls 數據流文件 app安卓本地路徑下載保存

//下載圖片 downloadToLocal() {plus.android.requestPermissions([android.permission.WRITE_EXTERNAL_STORAGE],(success) > {uni.saveImageToPhotosAlbum({filePath: /static/x.png,//本地地址success: () > {this.$refs.uToast.show({message: "模版下載成功&am…

Context Engineering:從Prompt Engineering到上下文工程的演進

最近在做Deepresearch以及刷到一個不錯的文章&#xff1a;context-engineering-guide &#xff0c;這篇文章揭示了提示工程以及上下文過程在智能體應用開源流程中&#xff0c;包括Deepresearch&#xff0c;MCP在內的一些概念&#xff0c;起到了非常重要的作用&#xff01; Cont…

jenkins部署vue前端項目

文章目錄前言一、安裝nginx二、jenkins構建項目總結前言 前面已經使用jenkins部署了后端springboot項目&#xff0c;現在開始學習jenkins部署前端Vue項目。 一、安裝nginx 訪問nginx官網&#xff0c;https://nginx.org/en/download.html下載tar包 上傳到服務器目錄中 然后到…

設計總監年中復盤:用Adobe XD內容識別布局,告別“手動調距”

時至年中&#xff0c;這不僅是檢視上半年項目成果的節點&#xff0c;更是優化團隊工作流、為下半年挑戰儲備動能的關鍵時期。在海外設計界工作的十余年間&#xff0c;我發現&#xff0c;一個高效的設計團隊與一個疲于奔命的團隊之間&#xff0c;最大的差別往往就在于是否建立了…

Unity 在Rider中通過Lingma插件使用MCP

環境&#xff1a; Unity 2022.3.12f1 JetBrains Rider 2025.1.4 Lingma 2.5.14 Python 3.13.4 下載包 首先在unity package manager 加入unity-mcp包 https://github.com/justinpbarnett/unity-mcp.git 然后下載uv包&#xff08;要先先下載python&#xff09;,網上很多…

pycharm+SSH 深度學習項目 遠程后臺運行命令

pycharmSSH 深度學習項目 遠程后臺運行命令碎碎念&#xff0c;都是實驗室里那說關機就關機&#xff0c;說重啟就重啟的臺式機逼得。。學吧記錄 運行&#xff1a;nohup /root/miniconda3/bin/python -u "run.py" > /root/log/nohup.log 2>&1 &實時查看日…

【Linux | 網絡】應用層(HTTP)

目錄一、認識URL二、urlencode和urldecode三、HTTP協議格式&#xff08;使用Fiddler抓包&#xff09;3.1 安裝并使用Fiddler抓包3.2 HTTP協議格式3.2.1 HTTP請求3.2.1.1 資源URL路徑3.2.1.2 請求方法&#xff08;Method&#xff09;3.2.1.3 Location頭字段&#xff08;重定向相…

編程實踐:單例模式(懶漢模式+餓漢模式)

說明:本專欄文章有兩種解鎖方案 1:付費訂閱,暢享所有文章 2:免費獲取,點擊下方鏈接,關注,自動獲取免費鏈接 https://free-img.400040.xyz/4/2025/04/29/6810a50b7ac8b.jpg 主題:C++ 單例模式 什么是單例模式

破局電機制造四大痛點:MES與AI視覺的協同智造實踐

萬界星空科技電機行業MES系統解決方案是針對電機制造過程中多工序協同難、質量追溯復雜、設備管理要求高等痛點設計的數字化管理系統。一、電機行業的核心痛點1. 多工序協同困難 電機制造涉及繞線、裝配、測試等多道工序&#xff0c;工藝銜接復雜&#xff0c;傳統人工調度效率…

HTML 初體驗

HTML&#xff08;超文本標記語言&#xff09;全稱&#xff1a;HyperText Markup Language。超文本是什么&#xff1f;答&#xff1a;超文本就是網頁中的鏈接。標記是什么&#xff1f;答&#xff1a;標記也叫標簽&#xff0c;是帶尖括號的文本。需求1&#xff1a;將“我愛中國”…

網絡層TCP機制

1.確認應答機制由于發送信息的距離可能較遠,可能出現后發的信息先到的情況,怎么辦?TCP將每個字節的數據都進行了編號,即為序列號如何分辨一個數據包是普通數據還是應答數據呢2.超時重傳由于丟包是一個隨機的事件,因此在上述tcp傳輸的過程中,丟包就存在兩種情況但是在發送方的角…

【一起來學AI大模型】微調技術:LoRA(Low-Rank Adaptation) 的實戰應用

LoRA&#xff08;Low-Rank Adaptation&#xff09; 的實戰應用&#xff0c;使用 Hugging Face 的 peft (Parameter-Efficient Fine-Tuning) 庫對大型語言模型進行高效微調。LoRA 因其顯著降低資源消耗&#xff08;顯存和計算&#xff09;同時保持接近全量微調性能的特點&#x…

RedisJSON 內存占用剖析與調優

一、基礎內存模型指針包裝 所有 JSON 值&#xff08;標量、對象、數組、字符串等&#xff09;至少占用 8 字節&#xff0c;用于存儲一個帶類型標記的指針。標量與空容器 null、true、false、小整數&#xff08;靜態緩存&#xff09;、空字符串、空數組、空對象 均不分配額外內存…

【LeetCode 熱題 100】23. 合并 K 個升序鏈表——(解法一)逐一合并

Problem: 23. 合并 K 個升序鏈表 題目&#xff1a;給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(K * N)空間復雜度&#xff1a;O(1…

垃圾收集器-Serial Old

第一章 引言1.1 JVM 中垃圾收集的簡要概述JVM&#xff08;Java Virtual Machine&#xff09;作為 Java 程序的運行時環境&#xff0c;負責將字節碼加載至內存并執行&#xff0c;同時也承擔著內存管理的重任。垃圾收集&#xff08;Garbage Collection&#xff0c;簡稱 GC&#x…

Docker(02) Docker-Compose、Dockerfile鏡像構建、Portainer

Docker-Compose 1、Docker Desktop 在Windows上安裝Docker服務&#xff0c;可以使用Docker Desktop這個應用程序。 下載并安裝這樣的一個安裝包 安裝好后&#xff1a;執行命令 docker --version 從Docker Hub提取hello-world映像并運行一個容器&#xff1a; docker run h…

大數據時代UI前端的用戶體驗設計新思維:以數據為驅動的情感化設計

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;從 “經驗設計” 到 “數據共情” 的體驗革命傳統 UI 設計常陷入 “設計師主觀經…

TypeScript 學習手冊

1.TypeScript 概念 TypeScript&#xff08;簡稱 TS&#xff0c;靜態類型&#xff09;是微軟公司開發的一種基于 JavaScript &#xff08;簡稱 JS&#xff0c;動態類型&#xff09;語言的編程語言。TypeScript 可以看成是 JavaScript 的超集&#xff08;superset&#xff09;&a…