MST
星途 面试题库

面试题:Rust中所有权转移与借用机制在函数调用场景下的表现

在Rust中,假设有一个函数`fn process_string(s: String) { }`,请描述当你调用这个函数时所有权是如何转移的。另外,如果将函数声明改为`fn process_string(s: &String) { }`,这又会发生什么变化,这种变化的本质原因是什么?
24.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 对于fn process_string(s: String)
    • 当调用这个函数时,所有权发生转移。调用者将String类型变量s的所有权转移给process_string函数。这意味着调用者在函数调用之后,不能再使用该变量。例如:
    fn process_string(s: String) {
        println!("The string is: {}", s);
    }
    fn main() {
        let my_string = String::from("Hello");
        process_string(my_string);
        // 这里如果尝试使用my_string,例如println!("{}", my_string); 会导致编译错误,因为所有权已转移
    }
    
  2. 对于fn process_string(s: &String)
    • 这里传递的是对String的引用。调用者将String的引用传递给函数,函数不会获取String的所有权。函数可以通过引用访问和操作String的内容,但所有权仍归调用者所有。例如:
    fn process_string(s: &String) {
        println!("The string is: {}", s);
    }
    fn main() {
        let my_string = String::from("Hello");
        process_string(&my_string);
        println!("The original string is: {}", my_string); // 这里可以继续使用my_string,因为所有权未转移
    }
    
  3. 变化的本质原因
    • Rust的所有权系统旨在在编译时确保内存安全。当传递String类型(值语义)时,所有权转移以防止内存重复释放等问题。而传递引用(&String,引用语义)时,函数只是借用数据,不会获取所有权,这样调用者仍然可以继续使用该数据,同时通过借用规则确保在同一时间只有一个可变引用或多个不可变引用,避免数据竞争。