MST

星途 面试题库

面试题:Rust所有权在函数调用中的转移和借用情况分析

假设有函数`fn process_data(data: Vec<i32>) { /* 处理数据 */ }`和`fn read_data() -> Vec<i32> { /* 返回数据 */ }`,请描述`let data = read_data(); process_data(data);`这一过程中所有权的转移情况。若`process_data`函数改为`fn process_data(data: &Vec<i32>) { /* 处理数据 */ }`,所有权又会如何变化,并且解释为何Rust这样设计。
41.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. fn process_data(data: Vec<i32>) 情况
    • let data = read_data();read_data 函数返回一个 Vec<i32>,此时 data 获得该 Vec<i32> 的所有权。
    • process_data(data);data 作为参数传递给 process_data 函数,所有权从 data 转移到 process_data 函数中的 data 参数。函数调用结束后,process_data 函数中 data 所拥有的 Vec<i32> 被销毁。
  2. fn process_data(data: &Vec<i32>) 情况
    • let data = read_data();read_data 函数返回一个 Vec<i32>data 获得该 Vec<i32> 的所有权。
    • process_data(data);:这里传递的是 data 的引用 &dataprocess_data 函数。所有权仍然在 data 手中,process_data 函数只是借用了 data 指向的 Vec<i32>。函数调用结束后,data 所拥有的 Vec<i32> 不会被销毁,因为 process_data 函数没有获得所有权。
  3. Rust 这样设计的原因
    • Rust 这样设计是为了在编译时确保内存安全,避免悬空指针、双重释放等内存相关的错误。通过所有权系统,Rust 明确了每个数据块的生命周期和所有者。当所有权转移时,原所有者就不再能合法访问该数据,从而防止了对已释放内存的访问。而引用机制(&)允许在不转移所有权的情况下临时访问数据,这样可以在多个地方高效地访问同一块数据,同时又保证了内存安全,因为 Rust 的借用规则保证了在任何时刻要么只有一个可变引用(防止数据竞争),要么有多个不可变引用(只读访问)。