Fix typo in rc-arc.md

pull/281/head
lijinpeng 3 years ago
parent 0f56ae4480
commit 7aaf6c9479

@ -7,7 +7,7 @@
## Rust中的资源回收
在一些无GC语言中程序员在一个变量无需再被使用时需要手动释放它占用的内存资源如果忘记了那么就会发生内存泄漏最终臭名昭著的`OOM`问题可能就会发生。
而在Rust中你可以指定在一个变量超出作用域时执行一段特定的代码最终编译器将帮你自动插入这段收尾代码。这样就无需在每一个使用该变量的地方都写一段代码来进行收尾工作和资源释放。不让人感叹Rust的大腿真粗
而在Rust中你可以指定在一个变量超出作用域时执行一段特定的代码最终编译器将帮你自动插入这段收尾代码。这样就无需在每一个使用该变量的地方都写一段代码来进行收尾工作和资源释放。不让人感叹Rust的大腿真粗
没错,指定这样一段收尾工作靠的就是咱这章的主角 - `Drop`特征。
@ -70,7 +70,7 @@ Dropping HasDrop2!
#### Drop的顺序
观察以上输出,我们可以得出以下关于`Drop`顺序的结论
- **变量级别,按照逆序的方式**,`_x`在`_foo`之前创建,因此`_x`在`_foo`之后被drop
- **变量级别,按照逆序的方式**,`_x`在`_foo`之前创建,因此`_x`在`_foo`之后被drop
- **结构体内部,按照顺序的方式**, 结构体`_x`中的字段按照定义中的顺序依次`drop`
#### 没有实现Drop的结构体
@ -152,7 +152,7 @@ Bingo完美拿走了所有权而且这种实现保证了后续的使用必
对于第二点,在之前我们已经详细介绍过,因此这里主要对第一点进行下简单说明。
在绝大多数情况下,我们都无需手动去`drop`以回收内存资源因为Rust会自动帮我们完成这些工作它甚至会对复杂类型的每个字段都单独的调用`drop`进行回收但是确实有极少数情况需要你自己来回收资源的例如文件描述符、网络socket等当这些超出作用域不再使用时就需要进行关闭以释放相关的资源在这些情况下就需要使用者自己来解决`Drop`的问题。
在绝大多数情况下,我们都无需手动去`drop`以回收内存资源因为Rust会自动帮我们完成这些工作它甚至会对复杂类型的每个字段都单独的调用`drop`进行回收但是确实有极少数情况需要你自己来回收资源的例如文件描述符、网络socket等当这些超出作用域不再使用时,就需要进行关闭以释放相关的资源,在这些情况下,就需要使用者自己来解决`Drop`的问题。
## 互斥的Copy和Drop

@ -47,7 +47,7 @@ fn main() {
不要给`clone`字样所迷惑,以为所有的`clone`都是深拷贝。这里的`clone`**仅仅复制了智能指针并增加了引用计数,并没有克隆底层数据**,因此`a`和`b`是共享了底层的字符串`s`,这种**复制效率是非常高**的。当然你也可以使用`a.clone()`的方式来克隆,但是从可读性角度,`Rc::clone`的方式我们更加推荐。
实际上Rust中还有不少`clone`都是浅拷贝,例如[迭代器的克隆](https://zhuanlan.zhihu.com/p/453149727).
实际上Rust中还有不少`clone`都是浅拷贝,例如[迭代器的克隆](https://course.rs/pitfalls/iterator-everywhere.html).
#### 观察引用计数的变化
使用关联函数`Rc::strong_count`可以获取当前引用计数的值,我们来观察下引用计数如何随着变量声明、释放而变化:

Loading…
Cancel
Save