Update Ch15

This commit is contained in:
Unisko PENG 2023-05-10 15:18:22 +08:00
parent 58095e8226
commit 07a91ba7de
3 changed files with 32 additions and 3 deletions

View File

@ -0,0 +1,8 @@
[package]
name = "drop_func_demo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@ -0,0 +1,19 @@
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println! ("正在使用数据 `{}` 弃用 CustomSmartPointer", self.data);
}
}
fn main() {
let c = CustomSmartPointer {
data: String::from("我的事情"),
};
println! ("已创建出一个 CustomSmartPointer 实例。");
drop(c);
println! ("在 main 结束之前这个 CustomSmartPointer 已被弃用。")
}

View File

@ -610,15 +610,17 @@ $ cargo run
文本 ``正在使用数据 `一些数据` 弃用 CustomSmartPointer!`` 被打印在 `已创建出一个 CustomSmartPointer 实例。``在 main 结束之前这个 CustomSmartPointer 已被弃用。` 之间,显示 `drop` 方法在这个时间点被调用来弃用 `c`
咱们可以许多种方式,使用 `Drop` 特质实现中所指明的代码,来令到资源清理变成方便且安全:比如就可以使用这种技巧,来创建出咱们自己的内存分配器!有了这个 `Drop` 特质及 Rust 的所有权系统,由于 Rust 会自动完成资源的清理,因此咱们就不必一定要记得清理资源了
咱们可以通过多种方式使用 `Drop` 特质实现中指定的代码,来方便和安全地进行清理:例如,咱们可以用他来创建咱们自己的内存分配器! 有了 `Drop` 特质和 Rust 的所有权系统,咱们不需要记得清理内存,因为 Rust 会自动完成
咱们还不必担心,意外清理仍在使用中的一些值而导致的问题:确保引用始终有效的所有权系统,会确保 `drop` 只会在该值不再会被使用时才被调用
咱们也不必担心因意外清理仍在使用的值而导致的问题:确保引用始终有效的所有权系统,还确保在值不再被使用时,`drop` 只被调用一次
既然咱们已经检视了 `Box<T>` 及灵巧指针的一些特征,接下来就要看看定义在标准库中的个别其他灵巧指针了
现在我们已经研究了 `Box<T>` 和灵巧指针的一些特性,让我们看看标准库中定义的其他几个智能指针
## `Rc<T>`,引用计数灵巧指针
**`Rc<T>`, the Reference Counted Smart Pointer**
大多数情况下所有权都是明确的咱们确切知道是哪个变量拥有者某个给定值。然而单个值可能有着多个所有者的情形也是有的。比如在图数据结构graph data structures多条边就可能指向同一节点从概念上讲而那个节点就是被所有指向他的边所拥有的。在已不再有任何边指向节点进而该节点已无所有者之前这个节点就不应被清理掉。
必须通过使用 Rust 的类型 `Rc<T>`,来显式地启用多重所有权,`Rc<T>` 即 *引用计数reference counting* 的缩写。`Rc<T>` 类型会追踪某个值的引用数,从而判断出该值是否仍在使用中。在到某个值的引用数为零时,该值就可以在不会有任何引用变成无效的情况下,(安全地)被清理掉。