Z
ZHANK
智能指针

Deref 与 Drop

Deref 自动解引用、DerefMut 可变、Drop 析构 RAII、手动 drop

Deref 与 Drop

Deref 让智能指针像普通引用一样使用(自动解引用),Drop 是 Rust 的 RAII——离开作用域自动清理。

学完本章你将: 掌握 Deref 自动解引用、Drop 析构、手动 drop。


Deref —— 自动解引用

rust
struct MyBox<T>(T);

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> { MyBox(x) }
}

use std::ops::Deref;

impl<T> Deref for MyBox<T> {
    type Target = T;
    fn deref(&self) -> &T {
        &self.0
    }
}

fn main() {
    let x = 5;
    let y = MyBox::new(x);

    // 不需要写 *y——Deref 自动调用
    assert_eq!(5, *y);  // *y = *(y.deref())

    // 隐式解引用转换
    fn hello(name: &str) { println!("Hello, {}!", name); }
    let m = MyBox::new(String::from("Rust"));
    hello(&m);  // &MyBox<String> → &String → &str(自动链式解引用)
}

Drop —— RAII 析构

rust
struct CustomSmartPointer {
    data: String,
}

impl Drop for CustomSmartPointer {
    fn drop(&mut self) {
        println!("释放: {}", self.data);
    }
}

fn main() {
    let c = CustomSmartPointer {
        data: String::from("资源1"),
    };
    {
        let d = CustomSmartPointer {
            data: String::from("资源2"),
        };
        println!("内部作用域");
    }  // d 在这里被 drop
    println!("外部作用域");
}  // c 在这里被 drop

// 输出顺序:
// 内部作用域
// 释放: 资源2
// 外部作用域
// 释放: 资源1

手动提前释放

rust
let c = CustomSmartPointer { data: String::from("手动释放") };
// c.drop();  // ❌ 不能显式调用 drop
drop(c);      // ✅ 用 std::mem::drop 提前释放