MST

星途 面试题库

面试题:Rust中所有权转移的场景及代码示例

请举例说明在Rust中,函数调用时所有权是如何转移的,并编写一段简单代码展示这一过程。同时解释为何这种所有权转移机制有助于内存管理。
40.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 所有权转移示例及代码
    • 在Rust中,当一个拥有所有权的值作为参数传递给函数时,所有权通常会转移给函数。例如:
fn main() {
    let s = String::from("hello");
    takes_ownership(s);
    // 这里不能再使用s,因为所有权已经转移给takes_ownership函数
    // println!("{}", s); // 这行代码会导致编译错误
}

fn takes_ownership(some_string: String) {
    println!("{}", some_string);
}
  • 在上述代码中,main函数创建了一个String类型的变量s,然后将s传递给takes_ownership函数。此时,s的所有权转移给了takes_ownership函数。在takes_ownership函数结束时,some_string(即之前的s)会被销毁,释放其占用的内存。
  1. 所有权转移机制有助于内存管理的原因
    • 自动内存回收:Rust通过所有权转移机制,在变量离开其作用域时自动回收内存。例如在上述代码中,takes_ownership函数结束时,some_string离开作用域,其所占内存被自动释放,无需像C++那样手动调用delete等操作,减少了内存泄漏的风险。
    • 避免悬空指针:由于所有权转移后原变量不再有效,不会出现像C++中指针所指向的内存已被释放,而指针仍在使用(悬空指针)的情况。因为在Rust中,一旦所有权转移,原变量不能再被使用,从根本上杜绝了悬空指针问题。
    • 明确的内存责任:所有权机制明确了每个变量对内存的责任。每个值在任何时刻都有且只有一个所有者,使得内存管理的逻辑更加清晰,便于开发者理解和维护代码。