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