學習筆記八——內存管理相關

📘 目錄

  1. 內存結構基礎:棧、堆、數據段
  2. Rust 的內存管理機制(對比 C/C++、Java)
  3. Drop:Rust 的自動清理機制
  4. Deref:為什么 *x 能訪問結構體內部值
  5. Rc:多個變量“共享一個資源”怎么辦?
  6. Weak:如何打破 Rc 的循環引用?
  7. borrow_mut 和 downgrade 是什么意思?
  8. 👁 Rc / Weak / Deref / Drop 關系圖
  9. 總結 & 使用建議

1?? 內存結構基礎

Rust 程序運行時,內存大致分為:

區域用途說明生命周期
存儲函數調用的局部變量函數調用期間
存儲動態分配的大對象顯式釋放或自動釋放
數據段靜態變量、全局變量等程序運行全過程

2?? Rust 的內存管理機制

  • Rust 不靠垃圾回收器
  • 通過“所有權 + 借用”系統管理內存
  • 編譯時就能判斷內存是否正確釋放
fn main() {let s = String::from("hello");let t = s;// println!("{}", s); // ? 錯誤:s 的所有權已經被轉移給 t
}

3?? Drop:變量作用域結束自動釋放

你可以實現 Drop trait,在變量被釋放時自動執行邏輯。

struct Connection;impl Drop for Connection {fn drop(&mut self) {println!("連接關閉!");}
}fn main() {let _conn = Connection;println!("連接中…");
}
// 輸出:連接中… ? 連接關閉!

4?? Deref:讓結構體支持 *x

Rust 中 *x 默認是用于“解引用”指針或引用。如果你想讓自己寫的結構體也支持 *x,就需要實現 Deref

use std::ops::Deref;struct MyBox<T>(T);impl<T> Deref for MyBox<T> {type Target = T;fn deref(&self) -> &Self::Target {&self.0 // 訪問結構體里的第一個字段}
}

5?? Rc:多個變量想“共同擁有”一個資源?

默認變量所有權不能共享:

let a = String::from("hi");
let b = a; // a 不再擁有字符串

如果你希望多個變量共享一個資源(比如多個節點共享同一根節點),可以用:

use std::rc::Rc;let a = Rc::new(String::from("hello"));
let b = Rc::clone(&a);  // ? 不是深拷貝,只是計數 +1
let c = Rc::clone(&a);

6?? Weak:如何解決 Rc 的循環引用?

🌀 什么是循環引用?

a → b → a   // 永遠互相指著,永遠無法釋放

? Weak 是什么?

  • Rc<T>:是“強引用”,決定資源釋放
  • Weak<T>:是“弱引用”,不會影響資源生命周期

7?? borrow_mut 和 downgrade 是什么意思?

🔹 borrow_mut 是什么?

當你使用 RefCell<T> 來包裹一個值時,可以在運行時借用它的可變引用。

use std::cell::RefCell;let x = RefCell::new(5);
*x.borrow_mut() = 10;  // ? 可變借用并修改

解釋:

  • .borrow_mut():是 RefCell 提供的方法
  • 它返回一個可變引用,類似于 &mut T,但是在運行時檢查是否有沖突

📌 注意:不能同時有可變和不可變借用,否則運行時會 panic。


🔹 downgrade 是什么?

Rc::downgrade(&rc) 是把一個 Rc<T> 強引用變成 Weak<T> 弱引用。

let strong = Rc::new(String::from("Rust"));
let weak = Rc::downgrade(&strong); // 不增加引用計數

可以用 weak.upgrade()Weak 轉回 Rc,如果值還活著,就返回 Some(Rc),否則是 None


🧪 示例:父子節點用 Weak 打破循環引用

use std::rc::{Rc, Weak};
use std::cell::RefCell;struct Node {value: i32,parent: RefCell<Option<Weak<Node>>>,  // 👈 防止循環引用children: RefCell<Vec<Rc<Node>>>,
}fn main() {let parent = Rc::new(Node {value: 1,parent: RefCell::new(None),children: RefCell::new(vec![]),});let child = Rc::new(Node {value: 2,parent: RefCell::new(Some(Rc::downgrade(&parent))),  // 🔥 不增加計數children: RefCell::new(vec![]),});parent.children.borrow_mut().push(child.clone());// 程序結束時能正確釋放所有節點
}

8?? 👁 Rc / Weak / Deref / Drop 關系圖

   ┌────────────┐│ Rc<T>      │?─────┐└────────────┘      │ Rc::clone()▲              ││              ││ Rc::downgrade│▼              │┌────────────┐      ││ Weak<T>    │────┐ │└────────────┘    │ ││            │ ││ upgrade()  ▼ ▼│       ┌─────────┐│       │ *x 解引用│(Deref)▼       └─────────┘drop()(當 Rc 引用數為 0 自動觸發)

? 總結 & 建議

工具功能說明典型使用場景
Rc<T>多個所有者,共享資源單線程共享結構,如樹結構
Weak<T>不增加計數,防止循環引用父指向子用 Rc,子指向父用 Weak
RefCell<T>運行時可變借用檢查單線程內部可變性
borrow_mut在 RefCell 中獲取可變引用RefCell<i32>.borrow_mut()
downgrade將 Rc 轉為 Weak,不影響引用計數避免結構間強依賴
Deref讓自定義類型也能用 *x 訪問內部值智能指針封裝
Drop離開作用域時自動釋放資源自動釋放連接、緩存等

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

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

相關文章

ReliefF 的原理

&#x1f31f; ReliefF 是什么&#xff1f; ReliefF 是一種“基于鄰居差異”的特征選擇方法&#xff0c;用來評估每個特征對分類任務的貢獻大小。 它的核心問題是&#xff1a; “我怎么知道某個特征是不是重要&#xff1f;是不是有能力把不同類別的數據區分開&#xff1f;” 而…

?asm匯編源代碼之-漢字點陣字庫顯示程序源代碼下載?

漢字點陣字庫顯示程序 源代碼下載 文本模式下顯示16x16點陣漢字庫內容的程序(標準16x16字庫需要使用CHGHZK轉換過后才能使用本程序正常顯示) 本程序需要調用file.asm和string.asm中的子程序,所以連接時需要把它們連接進來,如下 C:\> tlink showhzk file string 調用參…

【已更新完畢】2025泰迪杯數據挖掘競賽B題數學建模思路代碼文章教學:基于穿戴裝備的身體活動監測

基于穿戴裝備的身體活動監測 摘要 本研究基于加速度計采集的活動數據&#xff0c;旨在分析和統計100名志愿者在不同身體活動類別下的時長分布。通過對加速度數據的處理&#xff0c;活動被劃分為睡眠、靜態活動、低強度、中等強度和高強度五類&#xff0c;進而計算每個志愿者在…

Ubuntu24.04裝機安裝指南

文章目錄 Ubuntu24.04裝機安裝指南一、分區說明二、基礎軟件三、使用fcitx5配置中文輸入法四、安裝搜狗輸入法【**不推薦**】1. 安裝fcitx2. 安裝輸入法 五、禁用/home目錄下自動生成文件夾六、更新軟件源1. 針對**新配置方式**的清華源替換方法2. 針對**老配置方式**的清華源替…

互聯網三高-數據庫高并發之分庫分表ShardingJDBC

1 ShardingJDBC介紹 1.1 常見概念術語 ① 數據節點Node&#xff1a;數據分片的最小單元&#xff0c;由數據源名稱和數據表組成 如&#xff1a;ds0.product_order_0 ② 真實表&#xff1a;再分片的數據庫中真實存在的物理表 如&#xff1a;product_order_0 ③ 邏輯表&#xff1a…

BM25、BGE以及text2vec-base-chinese的區別

BM25、BGE以及text2vec-base-chinese的區別 BM25 原理:BM25(Best Matching 25)是一種基于概率檢索模型的算法,它通過考慮查詢詞與文檔之間的匹配程度、文檔的長度等因素,來計算文檔對于查詢的相關性得分。具體來說,它會給包含查詢詞次數較多、文檔長度適中的文檔更高的分…

Python中try用法、內置異常類型與自定義異常類型拓展

目錄 try介紹與語法格式try具體使用案例except的異常類型簡介案例內置的常見異常類型自定義異常類型繼承關系用途 注意事項 try介紹與語法格式 在 Python 里&#xff0c;try 語句主要用于異常處理&#xff0c;其作用是捕獲并處理代碼運行期間可能出現的異常&#xff0c;避免程…

【第41節】windows的中斷與異常及異常處理方式

目錄 一、中斷與異常處理 1.1 中斷與異常 1.2 IDT 1.3 異常的概念 1.4 異常分類 二、windows異常處理方式 2.1 概述 2.2 結構化異常處理 2.3 向量化異常處理之VEH 2.4 向量化異常處理之VCH 2.5 默認的異常處理函數 2.6 如何手動安裝 SEH 節點 2.7 異常處理的優先級…

分布式日志治理:Log4j2自定義Appender寫日志到RocketMQ

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

【HTML】html文件

HTML文件全解析&#xff1a;搭建網頁的基石 在互聯網的廣袤世界里&#xff0c;每一個絢麗多彩、功能各異的網頁背后&#xff0c;都離不開HTML文件的默默支撐。HTML&#xff0c;即超文本標記語言&#xff08;HyperText Markup Language&#xff09;&#xff0c;作為網頁創建的基…

oracle命令上下左右鍵無法使用如何解決?

1、問題如圖 2、解決辦法 (1) 安裝readline yum -y install readline* &#xff08;2&#xff09;安裝 rlwrap ##下載 wget http://files.cnblogs.com/files/killkill/rlwrap-0.30.tar.gz.zip ##解壓 tar -xzvf rlwrap-0.30.tar.gz.zip ##編譯安裝 ./configure make &&…

vue事假機制都有哪些

Vue 的事件機制主要包含以下幾種類型和方式&#xff0c;可以分為組件內部事件、父子組件通信事件、原生 DOM 事件封裝、修飾符增強等&#xff0c;下面詳細分類介紹&#xff1a; 一、DOM 事件綁定&#xff08;最基礎的事件&#xff09; 使用 v-on&#xff08;或簡寫 &#xff0…

系統編程2(消息隊列)

? 消息隊列概念 Linux系統中消息隊列&#xff08;Message Queue&#xff09;是進程間通信的一種方式&#xff0c;這種通信機制的好處是可以傳輸指定類型(用戶可以自行定義)的數據&#xff0c;相同類型的數據根據到達順序在隊列中進行排隊。 當然&#xff0c;不同類型的數據不…

Pytorch深度學習框架60天進階學習計劃 - 第41天:生成對抗網絡進階(二)

Pytorch深度學習框架60天進階學習計劃 - 第41天&#xff1a;生成對抗網絡進階&#xff08;二&#xff09; 7. 實現條件WGAN-GP # 訓練條件WGAN-GP def train_conditional_wgan_gp():# 用于記錄損失d_losses []g_losses []# 用于記錄生成樣本的多樣性&#xff08;通過類別分…

python 微博爬蟲 01

起因&#xff0c; 目的: ?下載單個視頻&#xff0c;完成。? 獲取某用戶的視頻列表&#xff0c;完成。剩下的就是&#xff0c; 根據視頻列表&#xff0c;逐個下載視頻&#xff0c;我沒做&#xff0c;沒意思。獲取視頻的評論&#xff0c;以后再說。 關鍵點記錄: 1. 對一個視…

Servlet、HTTP與Spring Boot Web全面解析與整合指南

目錄 第一部分&#xff1a;HTTP協議與Servlet基礎 1. HTTP協議核心知識 2. Servlet核心機制 第二部分&#xff1a;Spring Boot Web深度整合 1. Spring Boot Web架構 2. 創建Spring Boot Web應用 3. 控制器開發實踐 4. 請求與響應處理 第三部分&#xff1a;高級特性與最…

vue中根據html動態渲染內容2.0

上次使用的是p標簽用的contenteditable代替的可編輯的input&#xff0c;最后實現還是選擇了用el-input的textarea方式。 一開始考慮的是需要根據用戶輸入自動撐開輸入框&#xff0c;所以選擇了p標簽可編輯。 最后發現還是el-input會更好一點&#xff0c;只不過需要處理輸入框撐…

CentOS 系統磁盤擴容并掛載到根目錄(/)的詳細步驟

在使用 CentOS 系統時&#xff0c;經常會遇到需要擴展磁盤空間的情況。例如&#xff0c;當虛擬機的磁盤空間不足時&#xff0c;可以通過增加磁盤容量并將其掛載到根目錄&#xff08;/&#xff09;來解決。以下是一個完整的操作流程&#xff0c;詳細介紹了如何將新增的 10G 磁盤…

LINUX基礎 [二] - Linux常見指令

目錄 &#x1f4bb;前言 &#x1f4bb;指令 &#x1f3ae;ls指令 &#x1f3ae;pwd指令 &#x1f3ae;whoami指令 &#x1f3ae;cd指令 &#x1f3ae;clear指令 &#x1f3ae;touch指令 &#x1f3ae;mkdir指令 &#x1f3ae;rmdir指令 &#x1f3ae;rm指令 &#…

基于php的成績分析和預警與預測網站(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 人類現已邁入二十一世紀&#xff0c;科學技術日新月異&#xff0c;經濟、資訊等各方面都有了非常大的進步&#xff0c;尤其是資訊與網絡技術的飛速發展&#xff0c;對政治、經濟、軍事、文化、教育等各方面都有了極大的影響。 利用電腦網絡的這些便利&#xff0c;發展一套…