Rust筆記之智慧型指標

2021-09-29 15:37:23 字數 2468 閱讀 6165

指標: 是乙個包含記憶體位址的變數的通用概念。(rust中最常見的指標就是引用&t)

智慧型指標:是一類資料結構,它們的表現類似指標,但也有額外的元資料和功能。1. box

(1) box允許你將乙個值放在堆上而不是棧上,留在棧上的則是指向堆資料的指標。

(2) 除了資料被存放在堆上而不是棧上之外,box沒有效能損失,不過也沒有很多的額外功能。

(3) 使用場景:

當有乙個在編譯時未知大小的型別,而又想要在需要確切大小的上下文中使用這個型別值的時候;

當有大量資料並希望在確保資料不被拷貝的情況下轉移所有權的時候;

當希望擁有乙個值並只關心它的型別是否實現了特定trait而不是具體型別的時候;

(4)特徵:單一所有者,允許在編譯時執行不可變或可變借用檢查。

//解決遞迴型別的使用

//無法編譯通過的例子,原因時編譯器無法算出他所需的大小

enum list

fn main()

//改進

enum list

fn main()

box型別是乙個智慧型指標,它的值可以被當作引用對待,這是因為它實現deref trait,當box值離開作用域時,由於box還實現了drop trait,所以box所指向的堆資料也會被清除。

2. rc 引用計數智慧型指標

(1) 使用場景:當我們希望在堆上分配一些記憶體供程式的多個部分去讀取,而且無法在編譯時確定程式的哪一部分會最後結束使用它的時候。

(2)rx只能用於單執行緒場景。

(3)特徵:允許相同資料有多個所有者,在編譯時執行不可變借用檢查。

use std::rc::rc;

enum list

fn demo4()",rc::strong_count(&a));

}

3. refcell

(1) 作用:refcell用於當你確信**遵守借用規則,而編譯器不能理解和確定的時候。

(2)特徵:單一所有者,在執行時執行不可變或可變借用檢查。

1. deref trait

(1) 作用:實現deref trait允許我們過載解引用運算子『*』;通過這種方式實現deref trait的智慧型指標可以被當作常規引用來對待,可以編寫操作引用的**並用於智慧型指標。

//解決自定義型別提示的『cannot be dereferenced』問題

#struct mybox(t);

#impl mybox{};

use std::ops::deref;

implderef for mybox

}

2. drop trait

(1) 作用:drop trait 允許我們在值要離開作用域時執行一些**,所執行的**一般被用於釋放類似檔案或網路連線等資源。在box中,就是執行了釋放堆記憶體的**。

//演示drop

struct customsmartpointer

impl drop for customsmartpointer",self.data);

}}fn main() ;

println!("customsmartpointer created");

}//列印結果如下:

customsmartpointer created

dropping customsmartpointer with data my stuff

(2) 注意:rust不允許我們主動呼叫drop trait的drop方法,當我們希望在作用域結束之前就強制釋放變數的話,我們應使用的是由標準庫提供的std::mem::drop

//演示drop

struct customsmartpointer

impl drop for customsmartpointer",self.data);

}}fn main() ;

println!("customsmartpointer created");

drop(c);

println!("customsmartpointer end");

}//列印結果如下:

customsmartpointer created

dropping customsmartpointer with data my stuff

customsmartpointer end

1. 引用迴圈與記憶體洩漏

(1) 為了避免引用迴圈,在迴圈引用中,可以將其中乙個方向替換成weak。將rc的強引用為0,而弱引用不為0時,仍然可以情況該物件,這時我們就要借助weak的upgrade()方法來判斷引用物件是否有效。

//生成weaklet w = rc::downgrade(&rc);

//判斷若引用物件是否存在

let result = w.upgrade;//返回乙個option的值

可以參考此處

Rust 智慧型指標(二)

rc是引用計數指標,可以使用clone使得指標所指向的資料具有多個所有者。enum list use list use std rc rc fn main 需要注意的是,rc指標的資料是不可變的 refcell指標可以繞過編譯期借用檢查,普通指標和引用同一時間只能有乙個可變引用或者多個不可變引用。而...

智慧型指標筆記

前言智慧型指標是行為類似於指標的類物件。include include using namespace std void fun string str int main system pause return0 void fun string str 可以看出此 中有缺陷,在fun函式中,分配了堆中...

C 學習筆記之智慧型指標

眾所周知,c 中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點 1.緩衝區溢位 2.野指標 3.重複釋放記憶體 4.不配對的new delete 5.記憶體洩露 其中大多數的問題都是對指標的不正確使用帶來的。為此c 標準庫中對原始指標做了一些封裝,比如auto ptr,使得指標更容易使...