Update Ch15

This commit is contained in:
Peng Hailin, 2023-05-10 07:16:28 +08:00
parent b3e6da3a24
commit 8280ec39f3

View File

@ -575,9 +575,9 @@ error: could not compile `sp_demos` due to previous error
这个错误信息指出,我们不允许显式调用 `drop`。这条错误信息使用了术语 “解构函数destructor”这是清理实例的函数的通用编程术语。解构函数类似于 *构造函数constructor*后者创建一个实例。Rust 中的 `drop` 函数就是一个特殊的解构函数。
Rust 之所以不让咱们显式地调用 `drop`,是因为 Rust 仍将在 `main` 函数末尾,自动调用那个值上的 `drop`。由于 Rust 会两次尝试清理同一值,因此这就会导致 *双重释放double free* 的错误。
Rust 之所以不允许咱们显式地调用 `drop`,是因为 Rust 仍然会在 `main` 函数结尾处自动调用值上的 `drop`,这将导致 *双重释放double free* 的错误,由于 Rust 会试图对同一个值进行两次清理
咱们无法关闭这种在某个值超出作用域时的 `drop` 自动插入,同时又无法显式地调用 `drop` 方法。因此,在咱们需要强制某个值提前被清理掉时,就要使用 `std::mem::drop` 函数。
当值超出作用域时,我们无法禁用 `drop` 的自动插入,也无法显式调用 `drop` 方法。所以,如果我们需要强制一个值提前被清理,我们就使用 `std::mem::drop` 函数。
这个 `std::mem::drop` 函数不同于 `Drop` 特质中的那个 `drop` 方法。咱们是通过将要强制弃用的那个值作为参数传递,而调用他的。该函数位于 Rust 序曲中in the prelude因此这里就可以把清单 15-15 中的 `main` 函数,修改为如下清单 15-16 中所示的调用那个 `drop` 函数: