我有代码:
struct Foo {}
impl Default for Foo {
fn default() -> Self {
Self {}
}
}
impl Drop for Foo {
fn drop(&mut self) {
// Do something
}
}
fn main() {
{
let foo = Some(Foo::default());
let foo = None; // Would this line trigger `Foo::drop`?
};
{
let mut foo = Some(Foo::default());
foo = None; // Would this line trigger `Foo::drop`?
};
}
Run Code Online (Sandbox Code Playgroud)
s占用的资源是否得到foo正确释放?
第一种情况(变量被覆盖)不会触发drop,所以我添加了第二种情况,我也很困惑。
Run Code Online (Sandbox Code Playgroud)let foo = Some(Foo::default()); let foo = None; // Would this line trigger `Foo::drop`?
不,块的末尾会。
请记住,这let是一个变量声明,因此第二行不会修改第一行foo,而是创建一个新的变量foo来隐藏前一行。但它仍然存在(如果您在第二个之前创建了对它的引用,则可以访问它let)直到块末尾,因此它将在块末尾被删除。
如果你想实际改变变量,你必须这样做
let mut foo = Some(Foo::default());
foo = None;
Run Code Online (Sandbox Code Playgroud)
现在它将立即触发删除,因为旧值正在被覆盖,所以它必须删除它。