gpt4 book ai didi

rust - 何时为不再拥有的资源回收存储?

转载 作者:行者123 更新时间:2023-11-29 07:48:10 32 4
gpt4 key购买 nike

在下面程序的第 2 行中分配了一个矢量资源。当程序结束时,矢量资源不属于自己。如果一个资源根本不被拥有,它什么时候被回收?是否有使用 Rust 所有权语义和生命周期术语的解释可以让程序员相信这个资源确实被回收了?

fn main() {
let mut v = vec![1,2];
v = vec![3, 4];
}

最佳答案

when does [an unowned resource] get reclaimed?

在 Rust 术语中,一个项目在超出范围时被丢弃,这通常(但不总是)对应于 block 的末尾。当它被放下时,作为该项目一部分的任何资源也会被释放。

Resources 可以表示内存,如矢量示例中所示,但它也可以对应于其他事物,例如文件句柄或锁。这通常称为资源获取即初始化 (RAII)。

convince a programmer that this resource is indeed reclaimed?

你永远无法说服一个真正不想相信的人^_^。但是,您可以实现 Drop自己查看元素何时被丢弃:

struct NoisyDrop(u8);

impl Drop for NoisyDrop {
fn drop(&mut self) {
println!("Number {} being dropped", self.0);
}
}

fn main() {
println!("step 1");
let mut nd = NoisyDrop(1);
println!("step 2");
nd = NoisyDrop(2);
println!("step 3");
}

这将有输出

step 1
step 2
Number 1 being dropped
step 3
Number 2 being dropped

您可以看到第一个变量在其绑定(bind)被替换时被删除,因为不再有任何方法可以获取 NoisyDrop(1) 值。第二个变量由于方法结束而超出范围时被丢弃。

ownership semantics and lifetimes

考虑这个例子:

fn main() {
let mut v = vec![1];
v = vec![2];
}

从概念上讲,它可以写成

fn main() {
{
let v = vec![1];
}
{
v = vec![2];
}
}

还有这个例子

fn main() {
let v1 = vec![1];
let v2 = vec![2];
}

可以重写为

fn main() {
{
let v1 = vec![1];
{
let v2 = vec![2];
}
}
}

这些重写显示了每个变量的生命周期。每当您使用泛型生命周期参数 调用方法时, block 的生命周期将是替换'a 泛型的具体值。

关于rust - 何时为不再拥有的资源回收存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955165/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com