为弄明白这个问题,写了下面的代码。其中全局变量 D 被覆盖两次,代码和运行结果如下:
use std::ops::Drop;struct Data(i32);impl Drop for Data {fn drop(&mut self) {println!("drop...{}", self.0)}
}static mut D: Data = Data(0);fn main() {unsafe {D = Data(1);D = Data(2);}
}========= run result ==========drop...0
drop...1
可见,全局变量重新赋值时,原有的内容会首先调用 drop 释放资源,然后才会把新值放进去,以保证不会出现内存泄露。