MST

星途 面试题库

面试题:Rust内存管理机制之中等难度:所有权转移剖析

在Rust中,假设有两个函数`func1`和`func2`,`func1`创建一个字符串`String`类型变量`s`,然后将`s`传递给`func2`,请描述在这个过程中,所有权是如何转移的?同时,如果在`func2`中再次将`s`传递给另一个函数`func3`,所有权又会发生什么变化?请用代码示例说明。
30.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. func1func2的所有权转移
    • 在Rust中,当一个变量作为参数传递给函数时,所有权会转移到被调用的函数中。
    • func1创建一个String类型变量s并传递给func2时,func1不再拥有s的所有权,func2获得了s的所有权。
  2. func2func3的所有权转移
    • 同理,当sfunc2中被传递给func3时,func2不再拥有s的所有权,func3获得了s的所有权。

以下是代码示例:

fn func1() {
    let s = String::from("hello");
    func2(s);
    // 这里不能再使用s,因为所有权已经转移给func2
    // println!("{}", s); // 这行代码会报错
}

fn func2(s: String) {
    func3(s);
    // 这里不能再使用s,因为所有权已经转移给func3
    // println!("{}", s); // 这行代码会报错
}

fn func3(s: String) {
    println!("func3 received: {}", s);
    // s在func3函数结束时被释放
}

在上述代码中,func1创建字符串s并传递给func2func2再将s传递给func3,每次传递所有权都发生转移,原所有者失去对该变量的所有权。