Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah jenis penunjuk pintar?

Apakah jenis penunjuk pintar?

WBOY
WBOYasal
2024-06-05 11:11:091027semak imbas

Jenis penunjuk pintar dalam Rust termasuk: Kotak: menunjuk kepada nilai pada timbunan dan secara automatik melepaskan objek untuk mengelakkan kebocoran memori. Rc: membenarkan berbilang penunjuk untuk menghala ke objek timbunan yang sama, dan melepaskan objek apabila penunjuk terakhir hilang. Arka: Serupa dengan Rc, tetapi menyokong akses serentak berbilang benang. RefCell: Menyediakan peminjaman boleh ubah objek tidak berubah, memastikan hanya satu utas mengubah suai objek pada satu masa.

Apakah jenis penunjuk pintar?

Jenis penunjuk pintar

Penunjuk pintar ialah penunjuk kepada objek yang diperuntukkan secara dinamik yang digunakan untuk mengurus kitaran hayatnya dan mengelakkan kebocoran memori. Terdapat jenis penunjuk pintar berikut dalam Rust:

Box

  • Mengagihkan nilai pada timbunan dan mengembalikan penunjuk pintar yang menunjuk ke nilai tersebut.
  • Apabila penunjuk pintar keluar dari skop, ia akan melepaskan objek yang ditunjuk secara automatik untuk mengelakkan kebocoran memori.
let x = Box::new(5);

Rc

  • membenarkan berbilang penunjuk pintar untuk menghala ke objek yang diperuntukkan timbunan yang sama.
  • Apabila penunjuk pintar terakhir keluar dari skop, objek runcing akan dilepaskan.
let x = Rc::new(5);
let y = x.clone();

Arc

  • Serupa dengan Rc, tetapi menyokong akses serentak berbilang benang. 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

Arka penunjuk boleh dikongsi dengan selamat antara urutan yang berbeza. 🎜🎜rrreee🎜🎜RefCell🎜🎜🎜🎜 Menyediakan akses kepada peminjaman boleh ubah bagi objek tidak berubah. 🎜🎜Pastikan hanya satu utas boleh mengubah suai objek pada bila-bila masa. 🎜🎜rrreee🎜🎜Kes praktikal: Mengurus nod pokok binari 🎜🎜rrreee🎜Dalam contoh ini, penunjuk pintar Kotak digunakan untuk mengurus nod dan memastikan ia dilepaskan apabila pokok dimusnahkan. 🎜

Atas ialah kandungan terperinci Apakah jenis penunjuk pintar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn