面试题答案
一键面试场景举例
假设有一个博客系统,其中有 Post
结构体表示一篇文章,Author
结构体表示作者,Comment
结构体表示评论。一篇文章可以有多个评论,并且一篇文章属于一个作者。
struct Author {
name: String,
}
struct Comment {
text: String,
}
struct Post {
title: String,
author: &'a Author,
comments: Vec<Comment>,
}
所有权和生命周期管理
- 所有权管理:
Author
结构体拥有其name
字段的所有权,因为name
是String
类型,会在Author
实例销毁时释放内存。Comment
结构体拥有其text
字段的所有权,同样在Comment
实例销毁时释放内存。Post
结构体中,title
拥有其自身的所有权。comments
向量拥有其包含的所有Comment
实例的所有权。而author
是一个引用,所以Post
不拥有Author
实例的所有权。
- 生命周期管理:
- 在
Post
结构体定义中,author
引用被标注了生命周期'a
。这意味着Post
实例的生命周期不能超过它所引用的Author
实例的生命周期。 - 为了确保
Post
中author
引用的有效性,在创建Post
实例时,必须保证传入的Author
实例的生命周期足够长。例如:
- 在
fn main() {
let author = Author { name: String::from("John Doe") };
let post = Post {
title: String::from("Rust所有权与生命周期"),
author: &author,
comments: Vec::new(),
};
// post 的生命周期在 main 函数结束时结束,此时 author 仍然有效
}
避免悬空指针和内存泄漏
- 避免悬空指针:
- Rust 的编译器会检查生命周期标注,确保所有引用在其生命周期内都是有效的。如果尝试创建一个生命周期短于其引用对象的实例,编译器会报错。例如,如果在
author
之前销毁post
,编译器会阻止这种操作,因为post
中的author
引用会变成悬空指针。
- Rust 的编译器会检查生命周期标注,确保所有引用在其生命周期内都是有效的。如果尝试创建一个生命周期短于其引用对象的实例,编译器会报错。例如,如果在
- 避免内存泄漏:
- 由于 Rust 的所有权机制,当一个实例被销毁时,它所拥有的所有资源(如
String
类型的字段)都会自动释放。例如,当Post
实例被销毁时,title
和comments
中的所有Comment
实例都会被销毁,它们占用的内存会被释放。同样,Author
实例销毁时,name
占用的内存也会被释放,从而避免了内存泄漏。
- 由于 Rust 的所有权机制,当一个实例被销毁时,它所拥有的所有资源(如