我已经通过称为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的析构函数,后者将依次调用mappingdigit的析构函数,并递归调用其自己的left

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



生存期表明Digits可能不超过BaseCustom。这是有道理的,因为它包含对BaseCustom的引用。

也可以看看:

  • Do we need to manually create a destructor for a linked list?
  • 10-06 09:11