Rust中的Box<T>智能指针
引言
rust中有许多智能智能,关于智能指针的定义: 智能指针(Smart Pointers) 是一类封装了资源管理逻辑的数据结构,它们不仅仅是指向内存地址的“指针”,还负责资源的生命周期管理、所有权转移、引用计数、惰性计算等功能。 常见的智能指针有:
- Box
:在堆上分配数据; - Rc
:单线程下的引用计数; - Arc
:多线程下的原子引用计数; - RefCell
:运行时可变性(单线程); - Mutex
/ RwLock :用于线程安全的内部可变性 - Cell
:简单值类型的内部可变性(不返回引用)等等。
今天我们来着重介绍一下 Box
Box
Box
1 | let b = Box::new(123); |
- 123 是分配在堆上的
- b 是一个指向这个堆上数据的指针
使用场景
- 特意的将数据分配在堆上
- 数据较大时,又不想在转移所有权时进行数据拷贝
- 类型的大小在编译期无法确定,但是我们又需要固定大小的类型时
- 特征对象,用于说明对象实现了一个特征,而不是某个特定的类型
接下来,我们来详细说明
第一点,我们在日常实践中几乎很少遇到,意义不大,略过。
避免栈上的数据拷贝
当栈上的数据转移所有权时,实际上进行的时数据的拷贝,最终新旧数据拥有的是不同数据,只是值相同而已,因此所有权并未转移。
但是堆上则不同,堆上数据的所有权转移,实际上是复制指针,底层的数据并不会被拷贝,再将新的指针赋予新的变量,然后让拥有旧指针的变量失效,最终完成了所有权的转移。
1 | fn main() { |
将动态大小类型变为 Sized 固定大小类型
这一方面最常用的实践就是实现我们特殊的数据结构,比如我们的递归数据结构类型
1 | enum List { |
特征对象
我们一般无法使两个不同类型的变量放入一个数组中,但是特征对象可以做到。
特征对象(Trait Object) 是一种通过接口(trait)而非具体类型访问值的机制,Box
大概做法就是使不同的类型实现一个相同的特征接口(trait),达到将一个特征近似的看作我们自定义的类型,即特征对象,而实现了这个特征的结构体或者类型,都将属于我们特征对象。
1 | trait Animal { |
- Title: Rust中的Box<T>智能指针
- Author: tianyi
- Created at : 2025-08-06 20:02:08
- Updated at : 2025-08-07 16:06:00
- Link: https://github.com/ztygod/2025/08/06/Rust中的Box-T-智能指针/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments