MST

星途 面试题库

面试题:Rust中Box<T>与Rc<T>在基础内存管理上的区别

请阐述在Rust中Box<T>与Rc<T>在基础内存管理机制方面的区别,例如它们如何分配和释放内存,以及在所有权模型中的角色。
22.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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> 只能用于不可变数据,因为多个所有者同时对数据进行可变操作会导致数据竞争。