MST

星途 面试题库

面试题:Rust堆内存动态分配中的所有权与生命周期

假设你有一个包含多个`Box<T>`的自定义结构体,在结构体实例转移所有权和生命周期结束时,Rust的堆内存动态分配策略是如何确保内存安全且高效释放内存的?请结合具体代码示例说明。
24.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 定义包含Box<T>的自定义结构体
struct Container {
    data: Box<[i32]>,
}
  1. 结构体实例转移所有权时的内存情况
fn take_container(container: Container) {
    // `container` 在此处获得新的所有者,原所有者不再拥有该实例
    // 这里并没有释放内存,只是转移了所有权
}

fn main() {
    let c1 = Container { data: Box::new([1, 2, 3]) };
    take_container(c1);
    // 这里如果尝试使用 `c1` 会编译错误,因为所有权已转移
}
  1. 结构体生命周期结束时的内存释放
fn main() {
    {
        let c2 = Container { data: Box::new([4, 5, 6]) };
        // `c2` 在此块结束时,其析构函数被自动调用
    }
    // `c2` 已超出作用域,`Box<[i32]>` 所占用的堆内存被释放
}
  1. Rust内存管理策略说明
    • 所有权系统:Rust通过所有权系统来管理内存。每个值都有一个唯一的所有者,当所有者离开作用域,Rust会自动调用该值的析构函数。
    • Box<T>与堆内存Box<T>用于在堆上分配内存,当包含Box<T>的结构体实例的所有权转移时,Box<T>内部指向的堆内存的所有权也一同转移,而不是复制数据。当结构体实例生命周期结束,其析构函数被调用,会释放Box<T>指向的堆内存,确保内存安全且高效。例如上述Container结构体中的Box<[i32]>,在Container实例离开作用域时,Box<[i32]>占用的堆内存会被正确释放,不会出现内存泄漏等问题。