最简单直接的智能指针是box,其类型是Box<T>。box允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。Rust中栈与堆的区别
除了数据被储存在堆上而不是栈上之外,box没有性能损失。不过也没有很多额外的功能。
使用Box<T>在堆上储存数据
在讨论Box<T>的用例之前,我们学习一下语法以及如何与储存在Box<T>中的值进行交互。
如下使用box在堆上储存一个i32值:
let b = Box::new(5); println!("b is {}", b);
这里定义了变量b,其值是一个指向被分配在堆上的值5的Box。在这个例子中,我们可以像数据是储存在栈上的那样访问box中的数据。正如任何拥有数据所有权的值那样,当像b这样的box在main的末尾离开作用域时,它将被释放。这个释放过程作用于box本身(位于栈上)和它所指向的数据(位于堆上)。
Box<T> 类型是一个智能指针,因为它实现了 Deref trait,它允许 Box<T> 值被当作引用对待。当Box<T>值离开作用域时,由于Box<T>类型 Drop trait的实现,box所指向的堆数据也会被清除。