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...