rust alloc 笔记|boxed

19 阅读1分钟

版本:1.93.0

参考:boxed - allocBox<T> - Reference

注:目前还没学多少,像 write 这样的方法,Trait 实现和实验性内容就不提了。


学习 Box<T>,理解堆分配的基础,这是所有权和智能指针的起点。

boxed.rs

Box<T> 为 Rust 提供最简单的堆分配,拥有其内部的类型为 T: ?Sized 的数据对象的所有权。

所谓的 Global 是被默认使用的全局分配器,它维护了非空指针 *mut TBox\<T>\ 之间的变换。Layout 则是一个表示内存分配模式结构体,若有兴趣可参考 Layout - Rustonomicon

Box\<T\> 对 ZST 有特殊处理,它只是形式上地维护了一下对引用者的存在性。

对于 T: Sized,C 和 Rust 的数据可以通过 Box\<T\> 互操作。

示例代码中的 no-op 意思是无操作。

Struct Box

downcast 方法

将堆上的任意数据转化为可选值。

为了防止乱七八糟的跨特质转换,代码上用了三个 impl 去声明它。

image.png

new 方法

创建一个新的对象。

pin 方法

Pin\<T\> 保证这个类型为 T 的数据的地址不被移动。在自指结构等情况下有用。

into_pin 方法与之类似。

from_raw 方法

Box<T> 转换为原始指针 *mut T,转移所有权但不释放内存。

into_raw 方法

将原始指针 *mut T 转换回 Box<T>,重新获得所有权并恢复自动释放。编译器无法验证指针的有效性。

可参考 RAII - RustByExample

leak 方法

将 Box<T> 转换为 &'static mut T,故意泄漏内存获得静态生命周期引用。

这里的'static 可以理解成,内存就是泄漏了,不反悔地泄漏。