- Rust中Rc的内存管理原理:
- Rc是一种智能指针,它通过引用计数的方式来管理内存。每个Rc实例都会记录有多少个指针指向相同的堆内存数据。当引用计数变为0时,意味着没有任何指针指向该数据,此时Rc会自动释放其所指向的堆内存。
- 引用计数增减场景举例:
- 引用计数增加:
- 当通过
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
}
- 当引用计数为0时:
- 当引用计数为0时,Rc会自动释放其所指向的堆内存。这意味着存储在堆上的数据(如上面例子中的
String
)会被销毁,内存会被归还给系统。例如在上面第二个例子中,当s1
离开作用域后,引用计数变为0,其所指向的String
对象的内存就会被释放。