MST

星途 面试题库

面试题:Rust普通结构体与生命周期关联设计

设计一个Rust普通结构体,该结构体中有一个引用类型的字段。要求通过合理设计生命周期参数,使结构体在不同函数间传递和使用时能保证内存安全。请详细说明生命周期参数的作用及如何正确标注,并给出结构体定义、相关函数定义及使用示例。
42.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义一个结构体,包含一个引用类型的字段,'a 是生命周期参数
struct MyStruct<'a> {
    data: &'a i32,
}

// 定义一个函数,接受一个 MyStruct 实例并打印其字段的值
fn print_data(s: &MyStruct<'_>) {
    println!("The value is: {}", s.data);
}

fn main() {
    let num = 42;
    // 创建 MyStruct 实例,生命周期与 num 相关联
    let my_struct = MyStruct { data: &num };

    print_data(&my_struct);
}

生命周期参数作用及标注说明

  1. 作用:生命周期参数(这里是 'a)用于告知编译器,结构体中引用类型字段(data)的生命周期与其他数据(在 main 函数中是 num)的生命周期之间的关系。它确保在结构体的整个生命周期内,引用始终指向有效的内存,避免悬垂引用(dangling reference)问题,从而保证内存安全。
  2. 标注
    • 在结构体定义 struct MyStruct<'a> { data: &'a i32, } 中,<'a> 声明了一个生命周期参数 'a,并将其应用于 data 字段,表示 data 引用的 i32 值的生命周期至少与 'a 一样长。
    • 在函数 print_data(s: &MyStruct<'_>) 中,使用了 '_ 语法,这是一种生命周期省略的写法,它根据函数签名和 Rust 的生命周期推断规则,编译器可以推断出正确的生命周期。在这种情况下,它与 print_data(s: &MyStruct<'a>) 等效,其中 'aMyStruct 实例传入时的生命周期。在 main 函数中创建 MyStruct 实例时,data 引用的 num 的生命周期决定了 my_struct 的生命周期,从而也满足了 print_data 函数对 MyStruct 实例生命周期的要求。