Heim > Backend-Entwicklung > C++ > Hauptteil

Welche Arten von Smart Pointern gibt es?

WBOY
Freigeben: 2024-06-05 11:11:09
Original
1046 Leute haben es durchsucht

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);
Nach dem Login kopieren

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();
Nach dem Login kopieren

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);
});
Nach dem Login kopieren

RefCell

  • 提供对不可变对象的可变借用的访问。
  • 确保在任何时刻只有一个线程可以修改该对象。
use std::cell::RefCell;

let x = RefCell::new(5);
let mut y = x.borrow_mut();
*y = 6;
Nach dem Login kopieren

实战案例:管理二叉树节点

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);
Nach dem Login kopieren

在本例中,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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!