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