MST

星途 面试题库

面试题:Rust析构函数何时被调用

在Rust中,详细描述析构函数(Drop trait)会在哪些情况下被自动调用,请举例说明。
44.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

析构函数(Drop trait)自动调用的情况

  1. 变量离开作用域时
    • 当一个变量的作用域结束,其对应的析构函数会被调用。例如:
struct MyStruct {
    data: String,
}

impl Drop for MyStruct {
    fn drop(&mut self) {
        println!("Dropping MyStruct with data: {}", self.data);
    }
}

fn main() {
    {
        let s = MyStruct { data: "Hello".to_string() };
        // 当变量s离开这个块的作用域时,MyStruct的析构函数会被调用
    }
    println!("After the inner block");
}
  1. 容器类型中元素被移除时
    • 当从VecHashMap等容器中移除元素时,如果元素实现了Drop trait,该元素的析构函数会被调用。例如:
struct MyData {
    value: i32,
}

impl Drop for MyData {
    fn drop(&mut self) {
        println!("Dropping MyData with value: {}", self.value);
    }
}

fn main() {
    let mut vec = Vec::new();
    vec.push(MyData { value: 42 });
    let removed = vec.pop();
    // 当使用pop方法移除元素时,MyData的析构函数会被调用
    if let Some(data) = removed {
        println!("Removed: {}", data.value);
    }
}
  1. 整个容器被销毁时
    • 当一个实现了Drop trait的容器(如VecHashMap等)本身离开作用域被销毁时,容器中所有元素的析构函数也会被调用。例如:
struct Item {
    name: String,
}

impl Drop for Item {
    fn drop(&mut self) {
        println!("Dropping Item: {}", self.name);
    }
}

fn main() {
    {
        let mut items = Vec::new();
        items.push(Item { name: "item1".to_string() });
        items.push(Item { name: "item2".to_string() });
        // 当items离开这个块的作用域时,vec中两个Item的析构函数会被调用
    }
    println!("After the inner block");
}