欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

rust中智能指針的實(shí)現(xiàn)

 更新時(shí)間:2025年06月27日 09:44:02   作者:pumpkin84514  
Rust智能指針通過所有權(quán)實(shí)現(xiàn)資源自動(dòng)管理,包含Box、Rc、Arc、Mutex等類型,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、 什么是智能指針?Rust 三類指針對(duì)比

類型安全性借用檢查是否自動(dòng)釋放功能特點(diǎn)
&T, &mut T? 是? 是? 是借用引用,不擁有數(shù)據(jù)
*const T, *mut T? 否? 否? 否原生裸指針,用于 FFI、底層控制
智能指針(如 Box)? 是? 是/部分? 是擁有數(shù)據(jù),帶有自動(dòng)釋放和額外功能

?? 智能指針本質(zhì)是一個(gè)擁有值的結(jié)構(gòu)體,實(shí)現(xiàn)了 Deref 和 Drop,讓你可以像指針一樣訪問值,又能自動(dòng)釋放資源。

2、原生指針 *const T:危險(xiǎn)但有用

fn main() {
    let x = 5;
    let p: *const i32 = &x; // 獲取原生指針

    unsafe {
        println!("值是:{}", *p); // 只有在 unsafe 代碼塊中才能解引用
    }
}

? 只讀,不會(huì)自動(dòng)釋放。
? 無生命周期、越界檢查,容易懸垂。
?? 用于與 C 語(yǔ)言交互或?qū)崿F(xiàn)底層結(jié)構(gòu)。

手動(dòng)釋放:Box::into_raw / from_raw

fn main() {
    let b = Box::new(42);
    let ptr = Box::into_raw(b);         // 轉(zhuǎn)換為裸指針,不再自動(dòng)釋放

    unsafe {
        let b2 = Box::from_raw(ptr);    // 重新接管所有權(quán)
        println!("恢復(fù)值:{}", b2);
    } // 自動(dòng)釋放
}

?? 記?。?strong>誰(shuí) into_raw,誰(shuí)就必須 from_raw,否則泄漏!

3、常見智能指針逐個(gè)講清

Box:在堆上分配值

fn main() {
    let b = Box::new(100);              // 將整數(shù) 100 放到堆上
    println!("b 的值是:{}", *b);       // 解引用訪問
} // 離開作用域自動(dòng)釋放(RAII)

適合:大對(duì)象、遞歸結(jié)構(gòu)、強(qiáng)制所有權(quán)轉(zhuǎn)移。

Rc:?jiǎn)尉€程引用計(jì)數(shù)共享

use std::rc::Rc;

fn main() {
    let a = Rc::new("hello".to_string());
    let b = Rc::clone(&a);              // 引用計(jì)數(shù) +1
    println!("a = {}, b = {}", a, b);   // 多個(gè)變量共享同一塊內(nèi)存
}

適合:多個(gè)地方共享不可變數(shù)據(jù),如圖結(jié)構(gòu)、緩存。
?? 注意:不能用于多線程。

RefCell / Cell:內(nèi)部可變性

use std::cell::RefCell;

fn main() {
    let x = RefCell::new(10);           // 創(chuàng)建可變?nèi)萜?
    *x.borrow_mut() += 5;               // 可變借用
    println!("當(dāng)前值: {}", x.borrow());
}
  • RefCell:運(yùn)行時(shí)借用檢查,支持引用。
  • Cell:適合 Copy 類型的值,用 get/set 讀寫。

Cow:寫時(shí)復(fù)制,節(jié)省資源

use std::borrow::Cow;

fn modify(input: Cow<str>) -> Cow<str> {
    if input.contains("x") {
        Cow::Owned(input.replace("x", "y")) // 真要改時(shí)才復(fù)制
    } else {
        input
    }
}

fn main() {
    let s = Cow::Borrowed("hexo");
    let result = modify(s);
    println!("結(jié)果:{}", result);
}

適合:讀取多、寫入少的場(chǎng)景,如配置、模板處理。

Option 與智能指針

fn get_name() -> Option<&'static str> {
    Some("Tom")
}

fn main() {
    if let Some(name) = get_name() {
        println!("找到名字:{}", name);
    }
}

Option 表示“可能有值”或“無值”,智能指針經(jīng)常作為 Option 的值使用,用于“延遲初始化”。

4、 并發(fā)智能指針

Arc:線程安全引用計(jì)數(shù)

use std::sync::Arc;

fn main() {
    let a = Arc::new(42);
    let b = Arc::clone(&a);
    println!("a = {}, b = {}", a, b);
}

?? 與 Rc 類似,但用原子操作實(shí)現(xiàn),適合多線程。

Mutex:互斥鎖保護(hù)數(shù)據(jù)

use std::sync::Mutex;

fn main() {
    let m = Mutex::new(0);
    {
        let mut data = m.lock().unwrap();
        *data += 1;
    }
    println!("當(dāng)前值: {:?}", m);
}

?? 一次只能一個(gè)線程修改。

RwLock:讀多寫少,效率高

use std::sync::RwLock;

fn main() {
    let lock = RwLock::new(10);

    {
        let r1 = lock.read().unwrap();
        let r2 = lock.read().unwrap();
        println!("讀者1: {}, 讀者2: {}", r1, r2);
    }

    {
        let mut w = lock.write().unwrap();
        *w += 10;
    }

    println!("寫后值: {}", *lock.read().unwrap());
}

AtomicUsize:無鎖計(jì)數(shù)器

use std::sync::atomic::{AtomicUsize, Ordering};

fn main() {
    let counter = AtomicUsize::new(0);
    counter.fetch_add(1, Ordering::SeqCst); // 原子 +1
    println!("計(jì)數(shù)器值: {}", counter.load(Ordering::SeqCst));
}

適合:高性能并發(fā)狀態(tài)計(jì)數(shù),如連接數(shù)、任務(wù)狀態(tài)。

5、高階用法組合:Arc<Mutex>

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let c = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = c.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for h in handles {
        h.join().unwrap();
    }

    println!("最終結(jié)果: {}", *counter.lock().unwrap());
}

6、深入進(jìn)階:Weak / Pin / UnsafeCell

Weak:打破 Rc/Arc 的循環(huán)引用

use std::rc::{Rc, Weak};
use std::cell::RefCell;

struct Node {
    next: RefCell<Option<Rc<Node>>>,
    prev: RefCell<Option<Weak<Node>>>, // 使用弱引用避免循環(huán)
}

?? Rc::downgrade(&rc) 轉(zhuǎn)換為 Weak,不計(jì)入引用計(jì)數(shù)
?? .upgrade() 返回 Option<Rc>

Pin:防止對(duì)象被移動(dòng)

use std::pin::Pin;

fn main() {
    let data = String::from("hello");
    let pinned = Pin::new(&data);
    println!("{}", pinned);
}

?? 用于 Future、self-referential 結(jié)構(gòu)
?? Box::pin() 可固定對(duì)象

UnsafeCell:RefCell/Mutex 背后的魔法

use std::cell::UnsafeCell;

struct MyType {
    data: UnsafeCell<i32>,
}

unsafe impl Sync for MyType {}

fn main() {
    let x = MyType { data: UnsafeCell::new(0) };

    unsafe {
        *x.data.get() = 42;
        println!("{}", *x.data.get());
    }
}

?? 允許穿透不可變引用進(jìn)行修改,底層實(shí)現(xiàn) RefCell、Mutex

場(chǎng)景速查表

類型線程安全可變性常見用途
Box? 否? 是所有權(quán)轉(zhuǎn)移,遞歸結(jié)構(gòu)
Rc? 否? 否單線程共享只讀數(shù)據(jù)
RefCell? 否? 是內(nèi)部可變性,運(yùn)行時(shí)借用檢查
Cell? 否? 是Copy 類型小數(shù)據(jù)的替換
Cow? 是? 是寫時(shí)復(fù)制,節(jié)省資源
Arc? 是? 否多線程只讀共享
Mutex? 是? 是多線程可變共享
RwLock? 是? 是多讀單寫
AtomicUsize? 是? 是無鎖計(jì)數(shù)器,高性能狀態(tài)共享
Weak? 是? 否打破 Rc/Arc 循環(huán)引用
Pin? 是? 否防止移動(dòng),適用于異步/自引用結(jié)構(gòu)
UnsafeCell?(需手動(dòng)保證)? 是RefCell / Mutex 的底層支撐

總結(jié)建議

  • 智能指針 = 擁有數(shù)據(jù) + 自動(dòng)管理資源 + 像引用一樣使用
  • Rc、RefCell 是組合神器,但要小心引用環(huán)
  • Arc + Mutex 是并發(fā)安全的常見搭配
  • 遇到底層問題,了解 Pin / UnsafeCell 能更深入掌握 Rust 內(nèi)存模型

到此這篇關(guān)于rust中智能指針的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)rust 智能指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 利用rust編一個(gè)靜態(tài)博客工具

    利用rust編一個(gè)靜態(tài)博客工具

    這篇文章主要為大家詳細(xì)介紹了如何利用rust編一個(gè)靜態(tài)博客工具,這個(gè)靜態(tài)博客的工具主要是把md文檔轉(zhuǎn)為html靜態(tài)網(wǎng)站/博客,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 如何使用Rust的向量存儲(chǔ)值列表

    如何使用Rust的向量存儲(chǔ)值列表

    本文介紹了在Rust中使用向量存儲(chǔ)值列表的方法,包括創(chuàng)建、更新、讀取、遍歷、存儲(chǔ)多種類型以及內(nèi)存釋放等方面,向量是Rust中常用且強(qiáng)大的集合類型,熟練掌握其用法有助于編寫高效且安全的代碼
    2025-02-02
  • 淺析Rust多線程中如何安全的使用變量

    淺析Rust多線程中如何安全的使用變量

    這篇文章主要為大家詳細(xì)介紹了Rust如何在線程的閉包中安全的使用變量,包括共享變量和修改變量,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2025-01-01
  • 詳解Rust Substrate框架中的Runtime

    詳解Rust Substrate框架中的Runtime

    ubstrate是一個(gè)區(qū)塊鏈開發(fā)框架,它提供了一系列模塊化和可擴(kuò)展的組件,可以幫助開發(fā)人員快速構(gòu)建自定義區(qū)塊鏈。 Runtime是Substrate區(qū)塊鏈的核心部分,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • 通過rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    通過rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    本文介紹了如何使用Rust和imagecrate庫(kù)生成圖像驗(yàn)證碼,首先,通過Cargo.toml文件添加image依賴,然后,生成純色圖片并編輯驗(yàn)證圖片,接著,編寫隨機(jī)函數(shù)獲取字符,并通過循環(huán)生成驗(yàn)證碼圖片,最終,通過運(yùn)行函數(shù)驗(yàn)證驗(yàn)證碼圖片是否生成,感興趣的朋友一起看看吧
    2025-03-03
  • Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    在 Rust 中,如果想為enum實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來處理,這種方式可以擴(kuò)展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過示例代碼介紹Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制,感興趣的朋友一起看看吧
    2024-12-12
  • Rust調(diào)用C程序的實(shí)現(xiàn)步驟

    Rust調(diào)用C程序的實(shí)現(xiàn)步驟

    本文主要介紹了Rust調(diào)用C程序的實(shí)現(xiàn)步驟,包括創(chuàng)建C函數(shù)、編譯C代碼、鏈接Rust和C代碼等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • R語(yǔ)言ggplot2繪圖安裝與調(diào)試

    R語(yǔ)言ggplot2繪圖安裝與調(diào)試

    ggplot2是R語(yǔ)言中最常用的繪圖包之一,它提供了一種基于圖層的繪圖語(yǔ)法,使得用戶可以輕松地創(chuàng)建高質(zhì)量的數(shù)據(jù)可視化圖表。在使用ggplot2之前,需要先安裝該包并進(jìn)行調(diào)試。安裝ggplot2可以通過CRAN或GitHub進(jìn)行,調(diào)試則需要注意數(shù)據(jù)格式、語(yǔ)法錯(cuò)誤等問題。
    2023-06-06
  • Rust 原始指針功能探索

    Rust 原始指針功能探索

    這篇文章主要為大家介紹了Rust 原始指針功能探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    這篇文章主要介紹了rust中間件在項(xiàng)目中的使用實(shí)戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會(huì)話,錯(cuò)誤處理的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評(píng)論