Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Arten von Smart Pointern gibt es?

Welche Arten von Smart Pointern gibt es?

WBOY
WBOYOriginal
2024-06-05 11:11:091065Durchsuche

Zu den intelligenten Zeigertypen in Rust gehören: Box: Zeigt auf einen Wert auf dem Heap und gibt das Objekt automatisch frei, um Speicherlecks zu verhindern. Rc: Ermöglicht, dass mehrere Zeiger auf dasselbe Heap-Objekt zeigen, und gibt das Objekt frei, wenn der letzte Zeiger verschwindet. Arc: Ähnlich wie Rc, unterstützt jedoch gleichzeitigen Multithread-Zugriff. RefCell: Bietet veränderbares Ausleihen unveränderlicher Objekte und stellt sicher, dass jeweils nur ein Thread das Objekt ändert.

Welche Arten von Smart Pointern gibt es?

Arten von Smart Pointern

Ein Smart Pointer ist ein Zeiger auf ein dynamisch zugewiesenes Objekt, das zur Verwaltung seines Lebenszyklus und zur Verhinderung von Speicherverlusten verwendet wird. In Rust gibt es die folgenden Smart-Pointer-Typen:

Box

  • Ordnet einen Wert auf dem Heap zu und gibt einen Smart-Pointer zurück, der auf diesen Wert zeigt.
  • Wenn ein intelligenter Zeiger den Gültigkeitsbereich verlässt, gibt er automatisch das Objekt frei, auf das er zeigt, um Speicherverluste zu verhindern.
let x = Box::new(5);

Rc

  • ermöglicht es mehreren intelligenten Zeigern, auf dasselbe Heap-zugewiesene Objekt zu verweisen.
  • Wenn der letzte Smart Pointer den Gültigkeitsbereich verlässt, wird das angezeigte Objekt freigegeben.
let x = Rc::new(5);
let y = x.clone();

Arc

  • ähnelt Rc, unterstützt jedoch gleichzeitigen Multithread-Zugriff. 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-Zeiger können sicher zwischen verschiedenen Threads geteilt werden. 🎜🎜rrreee🎜🎜RefCell🎜🎜🎜🎜 Bietet Zugriff auf das veränderliche Ausleihen unveränderlicher Objekte. 🎜🎜Stellen Sie sicher, dass jeweils nur ein Thread das Objekt ändern kann. 🎜🎜rrreee🎜🎜Praktischer Fall: Binärbaumknoten verwalten 🎜🎜rrreee🎜In diesem Beispiel wird der Smart Pointer Box verwendet, um die Knoten zu verwalten und sicherzustellen, dass sie freigegeben werden, wenn der Baum zerstört wird. 🎜

Das obige ist der detaillierte Inhalt vonWelche Arten von Smart Pointern gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn