面试题答案
一键面试1. Box
- 内存分配与释放:
- 分配:
Box<T>
在堆上分配内存来存储类型T
的值。当Box<T>
被创建时,会在堆上为T
分配一块合适大小的内存空间,例如let b = Box::new(5);
就在堆上为i32
类型的值5
分配了内存。 - 释放:当
Box<T>
离开其作用域时,它所指向的堆内存会被释放。这遵循Rust的所有权和生命周期规则,Box<T>
拥有其内部值的所有权,当Box<T>
被销毁(比如离开作用域),其内部值也会被销毁,堆内存被释放。
- 分配:
- 所有权模型中的角色:
Box<T>
拥有唯一的所有权。一个Box<T>
实例唯一地拥有堆上存储的值,并且当这个Box<T>
被移动或销毁时,相关的所有权也随之转移或消失。例如,你可以将Box<T>
作为函数参数传递,此时所有权转移给函数中的对应参数。
2. Rc
- 内存分配与释放:
- 分配:
Rc<T>
在堆上分配两块内存,一块用于存储类型T
的值,另一块用于存储引用计数。引用计数用于记录指向堆上T
值的Rc<T>
实例的数量。例如let rc1 = Rc::new(5);
,会在堆上为i32
类型的值5
分配内存,同时为引用计数分配内存并初始化为1
。 - 释放:当
Rc<T>
的引用计数降为0
时,其所指向的堆内存(包括T
值和引用计数本身占用的内存)才会被释放。例如,当所有指向某个Rc<T>
实例的变量都离开作用域或被重新赋值时,引用计数递减,当减到0
时,内存释放。
- 分配:
- 所有权模型中的角色:
Rc<T>
提供共享所有权。多个Rc<T>
实例可以指向同一个堆上的值,它们共享这个值的所有权。通过克隆Rc<T>
实例(使用clone
方法),可以增加引用计数,从而创建更多共享所有权的实例。但Rc<T>
只能用于不可变数据,因为多个所有者同时对数据进行可变操作会导致数据竞争。