鍍金池/ 教程/ Java/ 裸指針
標(biāo)準(zhǔn)輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對(duì)象 (trait object)
rust web 開(kāi)發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹(shù)
編輯器
測(cè)試與評(píng)測(cè)
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯(cuò)誤處理
VS Code 安裝配置
動(dòng)態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實(shí)現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫(kù)
類型、運(yùn)算符和字符串
類型系統(tǒng)中的幾個(gè)常見(jiàn) trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標(biāo)準(zhǔn)庫(kù)示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對(duì)象
前期準(zhǔn)備
代碼風(fēng)格
編譯器參數(shù)
基于語(yǔ)義化版本的項(xiàng)目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語(yǔ)表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應(yīng)用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊(duì)列
目錄操作:簡(jiǎn)單grep
語(yǔ)句和表達(dá)式
并發(fā)編程
閉包
測(cè)試
閉包的語(yǔ)法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊(duì)列
Prelude
cargo簡(jiǎn)介
控制流(control flow)
數(shù)組、動(dòng)態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實(shí)戰(zhàn)篇
Rust 是一門系統(tǒng)級(jí)編程語(yǔ)言,被設(shè)計(jì)為保證內(nèi)存和線程安全,并防止段錯(cuò)誤。作為系統(tǒng)級(jí)編程語(yǔ)言,它的基本理念是 “零開(kāi)銷抽象”。理
運(yùn)算符重載
Any和反射
rust數(shù)據(jù)庫(kù)操作
輸入輸出流
復(fù)合類型
性能測(cè)試

裸指針

Rust通過(guò)限制智能指針的行為保障了編譯時(shí)安全,不過(guò)仍需要對(duì)指針做一些額外的操作。

*const T*mut TRust中被稱為“裸指針”。它允許別名,允許用來(lái)寫共享所有權(quán)的類型,甚至是內(nèi)存安全的共享內(nèi)存類型如:Rc<T>Arc<T>,但是賦予你更多權(quán)利的同時(shí)意味著你需要擔(dān)當(dāng)更多的責(zé)任:

  • 不能保證指向有效的內(nèi)存,甚至不能保證是非空的
  • 沒(méi)有任何自動(dòng)清除,所以需要手動(dòng)管理資源
  • 是普通舊式類型,也就是說(shuō),它不移動(dòng)所有權(quán),因此Rust編譯器不能保證不出像釋放后使用這種bug
  • 缺少任何形式的生命周期,不像&,因此編譯器不能判斷出懸垂指針
  • 除了不允許直接通過(guò)*const T改變外,沒(méi)有別名或可變性的保障

使用

創(chuàng)建一個(gè)裸指針:

let a = 1;
let b = &a as *const i32;

let mut x = 2;
let y = &mut x as *mut i32;

解引用需要在unsafe中進(jìn)行:

let a = 1;
let b = &a as *const i32;
let c = unsafe { *b };
println!("{}", c);

Box<T>into_raw

let a: Box<i32> = Box::new(10);
// 我們需要先解引用a,再隱式把 & 轉(zhuǎn)換成 *
let b: *const i32 = &*a;
// 使用 into_raw 方法
let c: *const i32 = Box::into_raw(a);

如上說(shuō)所,引用和裸指針之間可以隱式轉(zhuǎn)換,但隱式轉(zhuǎn)換后再解引用需要使用unsafe

// 顯式
let a = 1;
let b: *const i32 = &a as *const i32; //或者let b = &a as *const i32;
// 隱式
let c: *const i32 = &a;
unsafe {
    println!("{}", *c);
}
上一篇:Visual Studio下一篇:編譯器參數(shù)