目录

  1. 什么是 Rust 智能指针
  2. 为什么要使用智能指针
  3. 常用智能指针类型
  4. 智能指针的操作
  5. 智能指针与所有权
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 智能指针

Rust 智能指针 (Smart Pointers) 是一种封装原始指针并提供额外功能的数据结构。它们不仅指向内存,还管理数据的生命周期和所有权,常见于 std::ptrstd::rc 等模块。


为什么要使用智能指针

  • 资源管理:自动释放内存,避免手动操作。
  • 所有权共享:允许多个引用访问同一数据。
  • 安全性:防止悬垂指针和内存泄漏。
  • 灵活性:支持复杂的数据结构(如循环引用)。

常用智能指针类型

  1. Box<T>
  • 单一所有权的堆分配指针。
  • 用于将数据移到堆上。
  1. Rc<T>
  • 引用计数指针,允许多所有者。
  • 单线程使用。
  1. Arc<T>
  • 原子引用计数指针,多线程安全。
  1. RefCell<T>
  • 提供内部可变性,运行时检查借用。
  1. Mutex<T>RwLock<T>
  • 线程安全的可变性控制。

智能指针的操作

  • Box<T>
  • 创建:Box::new
  • 解引用:*.
  • Rc<T>Arc<T>
  • 克隆:Rc::cloneArc::clone
  • 获取引用计数:Rc::strong_count
  • RefCell<T>
  • 借用:borrow(不可变)、borrow_mut(可变)。
  • Mutex<T>
  • 锁定:lock 返回 MutexGuard

智能指针与所有权

  • Box<T>:独占所有权,离开作用域时释放。
  • Rc<T>Arc<T>:共享所有权,引用计数为 0 时释放。
  • RefCell<T>:不改变所有权,提供运行时借用检查。
  • 线程安全ArcMutex 确保并发安全。

代码示例

Box 使用

fn main() {
    let b = Box::new(42);
    println!("Box value: {}", *b);
}  // b 离开作用域,自动释放

运行结果:

Box value: 42

Rc 共享所有权

use std::rc::Rc;

fn main() {
    let data = Rc::new(String::from("Hello"));
    let data2 = Rc::clone(&data);
    println!("Data: {}, Count: {}", data, Rc::strong_count(&data));
    println!("Data2: {}", data2);
}

运行结果:

Data: Hello, Count: 2
Data2: Hello

RefCell 内部可变性

use std::cell::RefCell;

fn main() {
    let value = RefCell::new(5);
    let mut borrowed = value.borrow_mut();
    *borrowed += 10;
    println!("Value: {}", *value.borrow());
}

运行结果:

Value: 15

Arc 与 Mutex 并发

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..5 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Counter: {}", *counter.lock().unwrap());
}

运行结果:

Counter: 5

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持