Rust 智慧型指標(二)

2022-01-22 01:11:44 字數 2955 閱讀 2150

rc是引用計數指標,可以使用clone使得指標所指向的資料具有多個所有者。

enum list 

use list::;

use std::rc::rc;

fn main()

需要注意的是,rc指標的資料是不可變的

refcell指標可以繞過編譯期借用檢查,普通指標和引用同一時間只能有乙個可變引用或者多個不可變引用。而refcell把這個檢查推遲到了執行時。如果有引用違反了借用原則,程式會panic!

use std::cell::refcell;

struct s

fn main() );

s.borrow_mut().data=5;

println!("{}",s.borrow().data);

}

通過&self.borrow()獲得乙個不可變借用,&self.borrrow_mut()獲得乙個可變借用。

use std::cell::refcell;

struct s

fn main() );

let s1=s.borrow_mut();

let s2 = s.borrow_mut();

}

s有兩個可變引用,這很明顯違反了引用借用原則。所以執行後會得到乙個panic。

thread 'main' panicked at 'already borrowed: borrowmuterror', src\libcore\result.rs:997:5

stack backtrace:

0: std::sys_common::backtrace::_print

at src\libstd\sys\windows\backtrace/mod.rs:95

at src\libstd\sys\windows\backtrace/mod.rs:82

at src\libstd\sys_common/backtrace.rs:71

1: std::panicking::default_hook::}

at src\libstd\sys_common/backtrace.rs:59

at src\libstd/panicking.rs:197

2: std::panicking::default_hook

at src\libstd/panicking.rs:211

3: std::panicking::rust_panic_with_hook

at src\libstd/panicking.rs:474

4: std::panicking::continue_panic_fmt

at src\libstd/panicking.rs:381

5: rust_begin_unwind

at src\libstd/panicking.rs:308

6: core::panicking::panic_fmt

at src\libcore/panicking.rs:85

7: core::result::unwrap_failed

at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e\src\libcore/macros.rs:18

8: core::result::result::expect

at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e\src\libcore/result.rs:825

9: core::cell::refcell::borrow_mut

at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e\src\libcore/cell.rs:873

10: untitled::main

at src/main.rs:9

11: std::rt::lang_start::}

at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e\src\libstd/rt.rs:64

12: std::panicking::try::do_call

at src\libstd/rt.rs:49

at src\libstd/panicking.rs:293

13: _rust_maybe_catch_panic

at src\libpanic_unwind/lib.rs:87

14: std::rt::lang_start_internal

at src\libstd/panicking.rs:272

at src\libstd/panic.rs:388

at src\libstd/rt.rs:48

15: std::rt::lang_start

at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e\src\libstd/rt.rs:64

16: main

17: _tmaincrtstartup

18: maincrtstartup

19: unit_addrs_search

20: unit_addrs_search

use std::cell::refcell;

use std::rc::rc;

struct s

fn main() ));

let s1 = rc::clone(&s);

s1.borrow_mut().data=43;

println!("{}",refcell::borrow(&s).data);

}

輸出43

Rust筆記之智慧型指標

指標 是乙個包含記憶體位址的變數的通用概念。rust中最常見的指標就是引用 t 智慧型指標 是一類資料結構,它們的表現類似指標,但也有額外的元資料和功能。1.box 1 box允許你將乙個值放在堆上而不是棧上,留在棧上的則是指向堆資料的指標。2 除了資料被存放在堆上而不是棧上之外,box沒有效能損失...

智慧型指標(二)

智慧型指標存在的問題 通過對指標的封裝,讓類可以像指標一樣。這樣的智慧型指標還是存在些問題。之前我們解決了,物件拷貝問題,引入引用技術儲存拷貝次數,當拷貝次數為1時,便可以直接釋放析構物件。現在存在的新的問題是,之前都是用來管理單個物件,那麼如果想管理乙個陣列呢?因此出現了下面的問題 class a...

智慧型指標 二 scoped ptr

boost scoped ptr特點 boost scoped ptr的實現和std auto ptr非常類似,都是利用了乙個棧上的物件去管理乙個堆上的物件,從而使得堆上的物件隨著棧上的物件銷毀時自動刪除。不同的是,boost scoped ptr有著更嚴格的使用限制 不能拷貝。這就意味著 boos...