ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.18k stars 170 forks source link

第13.2.4节 元组析构顺序是确定的 第1版 第4次印刷 #294

Open zydxhs opened 4 years ago

zydxhs commented 4 years ago

页码与行数


析构顺序的描述不正确

一般来说,析构函数的调用顺序与变量的声明顺序相反。也就是说,如果存在明确的声 明顺序, 则编译器可以推断析构函数的调用顺序。但是对于同时声明的情况,比如声明一个 元组时 ,其 内 部元素的 生命周期是相同的 , 编译器无法推断到底该先调用谁的析构函数。当 出现这种情况的时候,就容易产生悬垂指针。

经过的我测试,代码清单 13-23 是可以正常运行的。

let (x,y); 修改为 let (y,x);,即调换下元组中 x, y 的顺序,代码清单 13-23 就无法通过编译。

这说明元组的析构顺序是确定的。可能是在较新的版本中,Rust 解决了析构顺序问题。

那么,还有哪些类型的析构顺序不确定呢?

rustc -V
rustc 1.43.1 (8d69840ab 2020-05-04)
zydxhs commented 4 years ago

第 497 页代码清单 13-26 也可以正常运行,不会因为析构顺序报错。 第 499~500 页代码清单 13-29,也不会因为在 drop 中读取 T 的内容而引起析构顺序改变;代码 19 行会因为 x2 的生命周期太短而报错,无法通过编译。

ZhangHanDong commented 4 years ago

@zydxhs 感谢反馈。估计是rustc升级修改过了