update ch15-06 close #546

pull/554/head
KaiserY 3 years ago committed by GitHub
parent e1215882de
commit 834e1c28cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -103,9 +103,7 @@ b rc count after changing a = 2
a rc count after changing a = 2
```
可以看到将 `a` 修改为指向 `b` 之后,`a` 和 `b` 中都有的 `Rc<List>` 实例的引用计数为 2。在 `main` 的结尾Rust 会尝试首先丢弃 `b`,这会使 `a``b``Rc<List>` 实例的引用计数减 1。
然而,因为 `a` 仍然引用 `b` 中的 `Rc<List>``Rc<List>` 的引用计数是 1 而不是 0所以 `Rc<List>` 在堆上的内存不会被丢弃。其内存会因为引用计数为 1 而永远停留。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环:
可以看到将列表 `a` 修改为指向 `b` 之后, `a``b` 中的 `Rc<List>` 实例的引用计数都是 2。在 `main` 的结尾Rust 首先丢弃变量 `b`,这会使 `b``Rc<List>` 实例的引用计数减 1。然而因为 `a` 仍然引用 `b` 中的 `Rc<List>``Rc<List>` 的引用计数是 1 而不是 0所以 `b` 中的 `Rc<List>` 在堆上的内存不会被丢弃。接下来 Rust 会丢弃 `a`,这同理会将 `a``Rc<List>` 实例的引用计数从 2 减为 1。这个实例的内存也不能被丢弃因为其他的 `Rc<List>` 实例仍在引用它。这些列表的内存将永远保持未被回收的状态。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环:
<img alt="Reference cycle of lists" src="img/trpl15-04.svg" class="center" />

Loading…
Cancel
Save