Open zydxhs opened 4 years ago
一般来说,析构函数的调用顺序与变量的声明顺序相反。也就是说,如果存在明确的声 明顺序, 则编译器可以推断析构函数的调用顺序。但是对于同时声明的情况,比如声明一个 元组时 ,其 内 部元素的 生命周期是相同的 , 编译器无法推断到底该先调用谁的析构函数。当 出现这种情况的时候,就容易产生悬垂指针。
经过的我测试,代码清单 13-23 是可以正常运行的。
把 let (x,y); 修改为 let (y,x);,即调换下元组中 x, y 的顺序,代码清单 13-23 就无法通过编译。
let (x,y);
let (y,x);
这说明元组的析构顺序是确定的。可能是在较新的版本中,Rust 解决了析构顺序问题。
那么,还有哪些类型的析构顺序不确定呢?
rustc -V rustc 1.43.1 (8d69840ab 2020-05-04)
第 497 页代码清单 13-26 也可以正常运行,不会因为析构顺序报错。 第 499~500 页代码清单 13-29,也不会因为在 drop 中读取 T 的内容而引起析构顺序改变;代码 19 行会因为 x2 的生命周期太短而报错,无法通过编译。
@zydxhs 感谢反馈。估计是rustc升级修改过了
页码与行数
析构顺序的描述不正确
经过的我测试,代码清单 13-23 是可以正常运行的。
把
let (x,y);
修改为let (y,x);
,即调换下元组中 x, y 的顺序,代码清单 13-23 就无法通过编译。这说明元组的析构顺序是确定的。可能是在较新的版本中,Rust 解决了析构顺序问题。
那么,还有哪些类型的析构顺序不确定呢?