我已经通过称为digits的链接列表在Rust中成功实现了自定义数字基础系统。
pub struct Digits<'a> {
mapping: &'a BaseCustom<char>,
digit: u64,
left: Option<Box<Digits<'a>>>,
}
我已经在链表结构上声明了生命周期,并将其直接链接到
BaseCustom
实例。当我重新分配链表的一半时,未引用的块会如何处理,而该块仍具有与BaseCustom
映射相关联的生存期?例如,我有一个看起来像“hello”的链接列表(在本示例中,我将使用从左到右的顺序,而不是像在我的项目中那样从右到左的顺序)
h -> e -> l -> l -> o
然后,我将链表引用从
e
重新分配给其他字符集。h -> e l -> l -> o
\
-> d -> g-> e
现在,代码不再使用hello的“llo”了,该内存会自动释放吗?这里的每个字符实例都引用了
BaseCustom
的生存期这一事实是否意味着内存将一直保留到程序结束?我知道Rust没有或没有使用垃圾收集器,因此对
BaseCustom
的生命周期引用使我感到困惑。是否说明这些商品必须与BaseCustom
一样长寿?还是它们在某个时候被释放了,但是BaseCustom
必须比它们长寿? 最佳答案
Say it with me:
Or the jargon version you might see elsewhere:
存在生命周期这一事实不会改变代码的行为。
当您用新值覆盖left
时,对于旧值一无所知,因此必须将其删除。在这种情况下,这意味着将删除Option<Box<Digits<'a>>>
类型的值。如果它是Some
,则调用Box
的析构函数,该析构函数依次调用Digits
的析构函数,后者将依次调用mapping
,digit
的析构函数,并递归调用其自己的left
。
删除引用或整数有什么作用?绝对没有。
生存期表明Digits
可能不超过BaseCustom
。这是有道理的,因为它包含对BaseCustom
的引用。
也可以看看: