Rust のスマート ポインタ タイプは次のとおりです: Box: ヒープ上の値を指し、メモリ リークを防ぐためにオブジェクトを自動的に解放します。 Rc: 複数のポインターが同じヒープ オブジェクトを指すことを許可し、最後のポインターが消えるとオブジェクトを解放します。 Arc: Rc に似ていますが、マルチスレッドの同時アクセスをサポートします。 RefCell: 不変オブジェクトの可変借用を提供し、一度に 1 つのスレッドのみがオブジェクトを変更するようにします。
スマート ポインターは、ライフ サイクルを管理し、メモリ リークを防ぐために使用される、動的に割り当てられたオブジェクトへのポインターです。 Rust には次のスマート ポインタ タイプがあります:
Box
let x = Box::new(5);
Rc
let x = Rc::new(5); let y = x.clone();
Arc
Rc
に似ていますが、マルチスレッドの同時アクセスをサポートします。 Rc
类似,但支持多线程并发访问。Arc
指针。use std::sync::Arc; let x = Arc::new(5); let thread = std::thread::spawn(move || { println!("{}", x); });
RefCell
use std::cell::RefCell; let x = RefCell::new(5); let mut y = x.borrow_mut(); *y = 6;
实战案例:管理二叉树节点
struct Node { value: i32, left: Option<Box<Node>>, right: Option<Box<Node>>, } impl Node { fn new(value: i32) -> Self { Self { value, left: None, right: None, } } fn insert(&mut self, value: i32) { if value < self.value { if let Some(ref mut left) = self.left { left.insert(value); } else { self.left = Some(Box::new(Node::new(value))); } } else { if let Some(ref mut right) = self.right { right.insert(value); } else { self.right = Some(Box::new(Node::new(value))); } } } } let mut root = Box::new(Node::new(10)); root.insert(5); root.insert(15);
在本例中,Box
Arc
ポインタは、異なるスレッド間で安全に共有できます。 🎜🎜rrreee🎜🎜RefCell🎜🎜🎜🎜 不変オブジェクトの変更可能な借用へのアクセスを提供します。 🎜🎜いつでも 1 つのスレッドだけがオブジェクトを変更できるようにしてください。 🎜🎜rrreee🎜🎜実際のケース: バイナリ ツリー ノードの管理🎜🎜rrreee🎜 この例では、Box
スマート ポインタを使用してノードを管理し、ツリーが破棄されたときにノードが解放されるようにします。 🎜以上がスマート ポインターにはどのような種類がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。