Appearance
11.4 Box 类型
Box 类型是一种常用的指针类型,代表“拥有所有权的指针”。
通过智能指针Box<T>
可以将数据分配到堆上(称之为装箱),创建不确定大小的数据结构,并且允许多个所有者之间共享这些数据结构。有以下三个使用Box<T>
的场景:
- 当有大量的数据,并且希望在确保数据不被拷贝的情况下转移所有权的时候
- 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候
- 希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候
与直接使用裸指针相比,Box 指针提供了更多的安全性和语义保证,在 Rust 代码中被广泛地使用。
用法如下:
rust
struct T{
value: i32
}
fn main() {
let p = Box::new(T { value: 1 });
println!("{}", p.value);
}
此时,p
会包含指向堆内存中 struct T 类型数据的指针,并持有该内存空间的所有权。之后如果要访问存储的具体数据,则必须通过解引⽤操作。
当 Box 对象p
超出其作用域时,Box<T>
的drop
函数会被自动调用,从而释放其所占用的内存空间。
Box 类型永远执行的是 move 语义,不能是 copy 语义。原因大家想想就可以明白,Rust 中的 copy 语义就是浅复制。 对于 Box 这样的类型而言,浅复制必然会造成二次释放问题。
对于 Rust 里面的所有变量,在使用前一定要合理初始化,否则会出现编译错误。 对于Box<T>
/&T
/&mut T
这样的类型,合理初始化意味着它一定指向了某个具体的对象,不可能是空。 如果用户确实需要“可能为空的”指针,必须使用类型Option<Box<T>>
。