Crate scope_gc

source ·
Expand description

使用

要使得类型可以被 GC 管理,需要为其实现 scope_gc::target::Target

RefObject 指的是与该类型匹配的引用集合,一旦值进入 GC 系统,我们就会在内部为其创建一个 RefObject
只有 RefObject 可以拥有指向被管理对象的引用,并且会追踪自身拥有的全部引用

pre_drop 将在 GC 确定要销毁,但还没有执行销毁时调用,此时,RefObject 持有的引用依然有效 pre_drop 过程不可逆,因此,任何试图修改引用结构以使得引用增加的行为都是未定义的 在销毁之前 pre_drop 会保证被调用

当然,为值实现 Drop 也是可行的,并且同样保证调用,但此时已经无法访问 GC 引用了

将值加入 GC 后,可以得到一个对应类型的 RootRef<'gc, Node<'gc, T>>
Node<'gc, T>RefObject<'gc>T 类型的值的总和
因此,你可以通过定义自己的 trait 来为 Node<'gc, T> 添加行为

GC::new 只能接受存活时间长于闭包的值 使用 GC::forget 接受存活时间较短的值,但执行回收时仅仅回收内存,其预析构和析构函数均不会被调用
使用 unsafe GC::dangling 接受存活时间较短的值,且执行与 GC::new 同样的逻辑
使用 GC::new_raw(x) 其等价于 GC::new(RawType(x)),不过不推荐如此,在此情况下,使用来自 Rc 无疑是更好的选择

Modules