📜  Rust——智能指针的概念(1)

📅  最后修改于: 2023-12-03 15:34:46.919000             🧑  作者: Mango

Rust——智能指针的概念

在 Rust 中,智能指针是一种数据结构,它允许在运行时跟踪内存上的数据。智能指针是一种引用类型,它允许在编译时确定数据的所有权和生命周期。Rust 中最常用的智能指针是 Box、Rc 和 Arc。

Box

通过使用 Box,可以将值放进堆内存中而不是栈中。Box 可以用于任何大小的值,因为它们始终存储在堆中。Box 的语法很简单:只需在值之前加上关键字 Box,就可以将值封装在堆内存中,而 Box 本身存储在栈中。

let a = Box::new(5);
Rc

Rc 意为“引用计数(reference counting)”。它是一种智能指针类型,可以让我们在一个或多个所有者之间共享值。Rc 会跟踪引用计数,如果没有任何所有者,它会自动释放内存。

use std::rc::Rc;

struct Person {
    name: Rc<String>,
    age: u8,
}

let name = Rc::new("Alice".to_string());
let person1 = Person { name: name.clone(), age: 25 };
let person2 = Person { name: name.clone(), age: 30 };
Arc

Arc 意为“原子引用计数(atomic reference counting)”,可安全地在并发环境下使用。与 Rc 不同的是,Arc 使用原子操作来更新引用计数,从而确保线程安全。

use std::sync::Arc;
use std::thread;

struct Person {
    name: Arc<String>,
    age: u8,
}

let name = Arc::new("Alice".to_string());
let person1 = Person { name: name.clone(), age: 25 };
let person2 = Person { name: name.clone(), age: 30 };

let t1 = thread::spawn(move || {
    println!("Name = {}, Age = {}", person1.name, person1.age);
});

let t2 = thread::spawn(move || {
    println!("Name = {}, Age = {}", person2.name, person2.age);
});

t1.join().unwrap();
t2.join().unwrap();

通过使用智能指针,我们可以轻松地跟踪内存上的数据,而不需要手动管理内存。在 Rust 中,使用智能指针是一种很好的实践,可以帮助我们编写更安全和可维护的代码。