在一些复杂的项目中,难免会出现循环引用的问题,这里记录一下如何使用
dumpster处理引用。
首先添加依赖:1
2[dependencies]
dumpster = "2"
dumpster的基本使用如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14use dumpster::unsync::Gc;
use std::cell::Cell;
fn main() {
let x = Gc::new(Cell::new(100));
println!("x={} {:?}", x.get(), x);
let y = x.clone();
println!("y={} {:?}", y.get(), y);
x.set(123);
println!("x={} {:?}", x.get(), x);
println!("y={} {:?}", y.get(), y);
}
测试一下,可以看到内存地址没有发生变化:1
2
3
4x=100 Gc { ptr: Cell { value: Nullable(0x62ade4ac4d90) } }
y=100 Gc { ptr: Cell { value: Nullable(0x62ade4ac4d90) } }
x=123 Gc { ptr: Cell { value: Nullable(0x62ade4ac4d90) } }
y=123 Gc { ptr: Cell { value: Nullable(0x62ade4ac4d90) } }
对于结构体的循环引用,可以使用dumpster处理,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28use dumpster::unsync::Gc;
use dumpster::Trace;
use std::cell::RefCell;
struct Foo {
value: i32,
ptr: Option<Gc<RefCell<Foo>>>,
}
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping Foo");
}
}
fn main() {
let foo = Gc::new(RefCell::new(Foo {
value: 123,
ptr: None,
}));
foo.borrow_mut().ptr = Some(foo.clone());
println!("foo = {:?}", foo);
let foo = 3;
println!("foo = {:?}", foo);
}
测试一下,可以看到对象被销毁了:1
2
3foo = Gc { ptr: Cell { value: Nullable(0x5b379afeeae0) } }
foo = 3
Dropping Foo
- 本文作者: killf
- 本文链接: https://www.killf.info/编程语言/Rust/Rust中的循环引用/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!