MST

星途 面试题库

面试题:Rust可变性与借用规则的交互

Rust有严格的借用规则,当涉及可变变量时,借用规则是如何工作的?假设有一个结构体,其中包含一个可变字段,写一段代码展示在不同借用场景下如何保证内存安全,同时说明可能遇到的借用错误及其原因。
39.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

借用规则

  1. 同一时间只能有一个可变引用:这确保了在任何时刻只有一个代码部分可以修改数据,避免数据竞争。
  2. 不可变引用和可变引用不能同时存在:不可变引用允许读取数据,可变引用允许修改数据。同时存在两者可能导致读 - 写或写 - 写冲突。

示例代码

struct MyStruct {
    data: i32,
}

fn main() {
    let mut s = MyStruct { data: 42 };

    // 可变借用
    let mut ref1 = &mut s.data;
    *ref1 = 43;
    // 这里不能再有其他对 s.data 的借用,否则会报错

    // 不可变借用
    let ref2 = &s.data;
    println!("Data: {}", ref2);
    // 此时不能有对 s.data 的可变借用,否则会报错
}

可能遇到的借用错误及其原因

  1. 双重可变借用错误
struct MyStruct {
    data: i32,
}

fn main() {
    let mut s = MyStruct { data: 42 };
    let ref1 = &mut s.data;
    let ref2 = &mut s.data; // 错误:不能在 `ref1` 有效时创建另一个可变引用 `ref2`
    *ref1 = 43;
    *ref2 = 44;
}

原因:违反了“同一时间只能有一个可变引用”的规则,可能导致数据竞争。

  1. 可变与不可变借用同时存在错误
struct MyStruct {
    data: i32,
}

fn main() {
    let mut s = MyStruct { data: 42 };
    let ref1 = &s.data;
    let ref2 = &mut s.data; // 错误:不能在 `ref1`(不可变引用)有效时创建可变引用 `ref2`
    *ref2 = 43;
}

原因:违反了“不可变引用和可变引用不能同时存在”的规则,可能导致数据不一致问题。