版本:1.93.0
参考:boxed - alloc,Box<T> - Reference
注:目前还没学多少,像 write 这样的方法,Trait 实现和实验性内容就不提了。
学习 Box<T>,理解堆分配的基础,这是所有权和智能指针的起点。
boxed.rs
Box<T> 为 Rust 提供最简单的堆分配,拥有其内部的类型为 T: ?Sized 的数据对象的所有权。
所谓的 Global 是被默认使用的全局分配器,它维护了非空指针 *mut T 和 Box\<T>\ 之间的变换。Layout 则是一个表示内存分配模式结构体,若有兴趣可参考 Layout - Rustonomicon。
Box\<T\> 对 ZST 有特殊处理,它只是形式上地维护了一下对引用者的存在性。
对于 T: Sized,C 和 Rust 的数据可以通过 Box\<T\> 互操作。
示例代码中的 no-op 意思是无操作。
Struct Box
downcast 方法
将堆上的任意数据转化为可选值。
为了防止乱七八糟的跨特质转换,代码上用了三个 impl 去声明它。
new 方法
创建一个新的对象。
pin 方法
Pin\<T\> 保证这个类型为 T 的数据的地址不被移动。在自指结构等情况下有用。
into_pin 方法与之类似。
from_raw 方法
将 Box<T> 转换为原始指针 *mut T,转移所有权但不释放内存。
into_raw 方法
将原始指针 *mut T 转换回 Box<T>,重新获得所有权并恢复自动释放。编译器无法验证指针的有效性。
leak 方法
将 Box<T> 转换为 &'static mut T,故意泄漏内存获得静态生命周期引用。
这里的'static 可以理解成,内存就是泄漏了,不反悔地泄漏。