diff --git a/book/contents/advance/smart-pointer/drop.md b/book/contents/advance/smart-pointer/drop.md index d731a460..27dcd35c 100644 --- a/book/contents/advance/smart-pointer/drop.md +++ b/book/contents/advance/smart-pointer/drop.md @@ -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 diff --git a/book/contents/advance/smart-pointer/rc-arc.md b/book/contents/advance/smart-pointer/rc-arc.md index d824c47f..8f8d4344 100644 --- a/book/contents/advance/smart-pointer/rc-arc.md +++ b/book/contents/advance/smart-pointer/rc-arc.md @@ -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`可以获取当前引用计数的值,我们来观察下引用计数如何随着变量声明、释放而变化: