
Rust:智能指针Box<T>
Table of Contents
BOX<T> 是一个用于在堆上分配内存的智能指针,提供对堆内存的所有权管理。
核心概念
堆分配
Box<T>将数据存储在堆Heap而非栈Stack上,栈上仅存储指向堆数据的指针所有权机制
Box<T>拥有指向数据的所有权,当Box离开作用域时,会自动释放堆内存 通过Drop trait固定大小的指针
无论
T的大小如何,Box<T>本身的大小是固定(一个指针的大小) 编译器可以处理需要已知大小的场景
常见使用场景
递归类型
当类型包含自身,直接定义会导致无限大小,通过
Box<T>固定指针大小解决struct ListNode { value: i32, next: Option<Box<ListNode>>, }大数据 避免栈溢出
将大型数据,数组,集合类型存储在对上,避免栈内存不足
let large_data = Box::new([0u8; 1_000_000]);Trait
当需要返回多种实现了同一个
trait的类型时, 使用Box<dyn Trait>实现动态分发trait Animal { fn speak(&self); } struct Dog; impl Animal for Dog { /* ... */ } struct Cat; impl Animal for Cat { /* ... */ } fn get_animal(name: &str) -> Box<dyn Animal> { match name { "dog" => Box::new(Dog), "cat" => Box::new(Cat), _ => panic!("Unknown animal"), } }转移所有权,无需复制数据
使用
Box<T>转移数据所有权,避免深拷贝let data = Box::new(2); let new_owner = data;Box<T> VS Rc<T>/Arc<T>
Box<T>是独占所有权,而Rc/Arc是引用技术共享所有权
