MST

星途 面试题库

面试题:Rust中引用计数指针Rc的内存管理机制

在Rust中,Rc(引用计数指针)是如何进行内存管理的?请举例说明其工作原理,包括引用计数的增减场景,以及当引用计数为0时会发生什么。
35.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. Rust中Rc的内存管理原理
    • Rc是一种智能指针,它通过引用计数的方式来管理内存。每个Rc实例都会记录有多少个指针指向相同的堆内存数据。当引用计数变为0时,意味着没有任何指针指向该数据,此时Rc会自动释放其所指向的堆内存。
  2. 引用计数增减场景举例
    • 引用计数增加
      • 当通过clone方法复制一个Rc实例时,引用计数会增加。
      • 例如:
use std::rc::Rc;
fn main() {
    let s1 = Rc::new(String::from("hello"));
    let s2 = s1.clone();
    // s1和s2指向相同的字符串数据,此时引用计数为2
    println!("s1引用计数: {}", Rc::strong_count(&s1));
    println!("s2引用计数: {}", Rc::strong_count(&s2));
}
  • 引用计数减少
    • 当一个Rc实例离开其作用域时,引用计数会减少。
    • 例如:
use std::rc::Rc;
fn main() {
    {
        let s1 = Rc::new(String::from("world"));
        let s2 = s1.clone();
        // s1和s2引用计数为2
    }
    // 这里s2离开作用域,引用计数减1,变为1
    // 当s1也离开作用域时,引用计数变为0
}
  1. 当引用计数为0时
    • 当引用计数为0时,Rc会自动释放其所指向的堆内存。这意味着存储在堆上的数据(如上面例子中的String)会被销毁,内存会被归还给系统。例如在上面第二个例子中,当s1离开作用域后,引用计数变为0,其所指向的String对象的内存就会被释放。