MST

星途 面试题库

面试题:Rust结构体移动语义与生命周期在复杂场景下的内存管理

假设存在如下复杂Rust代码: ```rust struct RefContainer<'a> { data: &'a mut Vec<i32> } struct MainContainer { sub_containers: Vec<RefContainer<'_>> } fn reorder_sub_containers(mut main_container: MainContainer) -> MainContainer { // 这里要对main_container中的sub_containers按data中的第一个元素大小进行排序, // 同时要处理好移动语义和生命周期,确保内存安全。请实现该函数,并详细解释移动语义和生命周期在其中的作用。 } ```
42.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct RefContainer<'a> {
    data: &'a mut Vec<i32>
}

struct MainContainer {
    sub_containers: Vec<RefContainer<'_>>
}

fn reorder_sub_containers(mut main_container: MainContainer) -> MainContainer {
    main_container.sub_containers.sort_by_key(|ref_container| *ref_container.data.get(0).unwrap());
    main_container
}

移动语义的作用

  1. 参数传递reorder_sub_containers函数接收main_container作为参数,这里main_container的所有权被移动到函数内部。这意味着调用该函数后,调用者不再拥有main_container的所有权。
  2. 返回值:函数返回main_container,将所有权从函数内部移动到调用者。这样确保了MainContainer实例的所有权始终有唯一的所有者,避免了双重释放等内存安全问题。

生命周期的作用

  1. RefContainer的生命周期RefContainer结构体持有对Vec<i32>的可变引用,其生命周期参数'a表示该引用的生命周期。这里'_MainContainer中的使用,表示编译器会自动推断这些引用的生命周期。
  2. 排序过程中的生命周期:在排序过程中,sort_by_key函数会对sub_containers中的RefContainer进行操作。由于RefContainer中的引用指向外部的Vec<i32>,只要这些Vec<i32>的生命周期长于MainContainer实例的生命周期,并且在排序操作过程中,引用的有效性能够得到保证,就不会出现悬空引用等问题。在这个实现中,因为没有改变引用的指向或者延长/缩短其生命周期,所以内存安全能够得到保障。