面试题答案
一键面试以下是 Rust 代码实现:
struct MyStruct {
data: Vec<i32>,
}
fn create_my_struct() -> MyStruct {
MyStruct {
data: vec![1, 2, 3],
}
}
所有权转移和管理
- 函数内部:
- 在
create_my_struct
函数内部,vec![1, 2, 3]
创建了一个Vec<i32>
实例,它拥有分配在堆上的内存。 - 然后
MyStruct
结构体实例被创建,其data
成员接收了Vec<i32>
的所有权。
- 在
- 函数返回:
- 当
create_my_struct
函数返回MyStruct
实例时,整个MyStruct
实例的所有权被转移给调用者。这意味着调用者现在完全拥有MyStruct
实例及其内部的Vec<i32>
。
- 当
安全性解释
- 内存安全:
- Rust 的所有权系统确保在任何时刻,堆上的内存只有一个所有者。当
create_my_struct
函数返回MyStruct
实例时,之前在函数内创建的Vec<i32>
的所有权被转移给调用者。当调用者不再使用MyStruct
实例时,MyStruct
的析构函数会被调用,进而Vec<i32>
的析构函数也会被调用,释放堆上的内存。这避免了内存泄漏和悬空指针的问题。
- Rust 的所有权系统确保在任何时刻,堆上的内存只有一个所有者。当
- 数据一致性:
- 由于同一时间只有一个所有者,不存在多个地方同时尝试修改
Vec<i32>
数据的情况,从而保证了数据的一致性。如果在函数返回后,原函数内部还能访问Vec<i32>
,就可能出现数据竞争等问题。但 Rust 的所有权规则阻止了这种情况发生,使得代码在多线程环境下也能保持安全。
- 由于同一时间只有一个所有者,不存在多个地方同时尝试修改