Rust 中 Drop 特性的实际用例?

问题描述 投票:0回答:1

我一直在阅读 Rust 书,在第 15.3 章中他们介绍了 Drop 特性。它说该特征对于实现智能指针很重要(“智能指针模式的第二个重要特征是 Drop”),但从提供的示例中我看不出原因:

struct CustomSmartPointer {
    data: String,
}

impl Drop for CustomSmartPointer {
    fn drop(&mut self) {
        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    }
}

fn main() {
    let c = CustomSmartPointer {
        data: String::from("my stuff"),
    };
    let d = CustomSmartPointer {
        data: String::from("other stuff"),
    };
    println!("CustomSmartPointers created.");
}

他们只是在容器超出范围之前打印容器拥有的值(据我所知,无论如何它都会被丢弃)。

关于这一点,他们说:“我们在这里打印一些文本以直观地演示 Rust 何时调用 drop。”

是的,但是没有提供示例来说明该特征实际上是如何有用的(我猜除了可能正在释放的日志记录资源之外)。

所以我的问题是:在这种情况下,Drop 的实现有多重要?省略它是否会导致内存泄漏或其他问题?我觉得我完全错过了重点。有人可以提供一个用例,除了在超出范围之前打印值之外还能做任何事情吗?

我尝试删除 drop 实现,但这并没有改变任何东西,除了当 CustomSmartPointer 超出范围时没有打印任何东西。没有编译器错误。

pointers rust smart-pointers
1个回答
3
投票

在很多情况下,您可能希望在删除值时执行某些操作。

  • 您正在手动管理内存。这甚至不必使用本机 API;它可以使用
    Box::into_raw
    /
    Box::leak
    Box::from_raw
    .
  • 您正在本机操作系统资源(如文件句柄或网络套接字)之上实现 Rust 接口。当 Rust-side 值被丢弃时,你需要告诉操作系统销毁资源。
  • 你正在一些第三方库之上实现一个 Rust 接口。考虑 SQLite、libpcap 等。当 Rust 句柄被删除时,您想清理该库中的资源。
  • 你正在实施一个守卫,比如
    RefCell
    Mutex
    守卫。当守卫掉线时,需要调整一个引用计数或者释放锁。
  • 你正在实现一个连接池。当池中的连接被删除时,您希望将连接返回到池中,以便以后可以重用它。
  • 等等……

在大多数应用程序中,您很少需要手动实现

Drop
。但是,它是 RAII 习语的重要组成部分,因此您会在实现该习语的地方看到它的使用。

© www.soinside.com 2019 - 2024. All rights reserved.