gpt4 book ai didi

rust - 当我重新分配链表的一半时,不再引用的 block 会发生什么?

转载 作者:行者123 更新时间:2023-11-29 08:29:54 25 4
gpt4 key购买 nike

我已经通过名为 digits 的链表在 Rust 中成功实现了自定义数字基础系统.

pub struct Digits<'a> {
mapping: &'a BaseCustom<char>,
digit: u64,
left: Option<Box<Digits<'a>>>,
}

我已经在链表结构上声明了生命周期并将其直接链接到 BaseCustom 的实例。当我重新分配链表的一半时,未引用的 block 会发生什么,它的生命周期仍与 BaseCustom 映射相关联?

例如,我有一个看起来像“hello”的链表(我将在这个例子中使用从左到右,而不是像在我的项目中那样从右到左)

h -> e -> l -> l -> o

然后我将链表引用从 e 重新分配给一组不同的字符。

h -> e    l -> l -> o
\
-> d -> g-> e

既然代码不再使用 hello 的“llo”,那 block 内存会自动释放吗?这里的每个字符实例都引用了 BaseCustom 的生命周期,这是否意味着内存会一直保留到程序结束?

我知道 Rust 没有或不使用垃圾收集器,所以对 BaseCustom 的生命周期引用在这里让我感到困惑。它是否声明项目必须与 BaseCustom 一样长?还是它们在某个时候被释放了,但 BaseCustom 必须比它们长寿?

最佳答案

Does the fact that each character instance here have a reference to BaseCustom's lifetime mean that the memory is held on to until the program ends?

Say it with me :

Lifetime annotations don’t change how long any of the references involved live

Or the jargon version you might see elsewhere :

Lifetimes are descriptive, not prescriptive.

存在生命周期的事实不会改变代码的行为。

当您覆盖 left 时有了新值,旧值一无所知,因此必须将其删除。在这种情况下,这意味着类型为 Option<Box<Digits<'a>>> 的值被丢弃。如果是 Some , 这会调用 Box 的析构函数这将依次调用 Digits 的析构函数, 这将为 mapping 调用析构函数, digit , 并递归为其自身 left .

删除引用或整数有什么作用?绝对没有。

Is it stating that the items must live as long as BaseCustom? Or is it that they get freed up at some point but BaseCustom must outlive them?

生命周期表明 Digits可能活不过 BaseCustom .这是有道理的,因为它包含对 BaseCustom 的引用.


另见:

关于rust - 当我重新分配链表的一半时,不再引用的 block 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45553304/

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