MST

星途 面试题库

面试题:Rust中Box<T>和Rc<T>在简单场景下的内存管理差异

请描述在如下Rust代码场景中,Box<T>和Rc<T>内存管理的区别。假设有一个结构体`MyStruct`,定义如下:`struct MyStruct { data: i32 }`。分别使用`Box<MyStruct>`和`Rc<MyStruct>`来创建实例,并在一个函数中传递和使用,说明它们的内存何时被释放以及所有权是如何转移或共享的。
10.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Box

  1. 所有权转移Box用于将数据分配到堆上,并拥有这个数据的唯一所有权。当Box被传递给函数或赋值给另一个变量时,所有权发生转移。
  2. 内存释放:当Box离开其作用域,Box被销毁,它所指向的堆内存也会被释放。

示例代码:

struct MyStruct { 
    data: i32 
}

fn use_box(boxed: Box<MyStruct>) {
    println!("Data in box: {}", boxed.data);
    // boxed离开此函数作用域时被销毁,内存释放
}

fn main() {
    let my_box = Box::new(MyStruct { data: 42 });
    use_box(my_box);
    // 这里my_box不再有效,因为所有权已经转移到use_box函数中
}

Rc

  1. 所有权共享Rc(引用计数)允许在多个变量之间共享数据的所有权。每个Rc实例都维护一个引用计数,记录有多少个Rc指向同一数据。
  2. 内存释放:当最后一个指向数据的Rc实例被销毁,引用计数降为0,此时堆上的数据才会被释放。

示例代码:

use std::rc::Rc;

struct MyStruct { 
    data: i32 
}

fn use_rc(shared: Rc<MyStruct>) {
    println!("Data in rc: {}", shared.data);
    // shared离开此函数作用域时,引用计数减1,但数据不会立即释放
}

fn main() {
    let my_rc = Rc::new(MyStruct { data: 42 });
    let rc_clone = my_rc.clone();
    use_rc(my_rc);
    use_rc(rc_clone);
    // 这里my_rc和rc_clone离开作用域,引用计数降为0,数据释放
}

总结来说,Box适用于需要唯一所有权的场景,而Rc适用于需要在多个地方共享只读数据所有权的场景。