📅  最后修改于: 2020-11-02 04:24:10             🧑  作者: Mango
Rust默认情况下在堆栈上分配所有内容。您可以通过将它们包装在Box之类的智能指针中来将它们存储在堆上。 Vec和String之类的类型隐式帮助堆分配。智能指针实现下表中列出的特征。智能指针的这些特征将它们与普通结构区分开来-
Sr.No | Trait name | Package & Description |
---|---|---|
1 | Deref |
std::ops::Deref Used for immutable dereferencing operations, like *v. |
2 | Drop |
std::ops::Drop Used to run some code when a value goes out of scope. This is sometimes called a destructor |
在本章中,我们将学习Box智能指针。我们还将学习如何创建自定义的智能指针(如Box)。
Box智能指针(也称为Box)使您可以将数据存储在堆而不是堆栈上。堆栈包含指向堆数据的指针。 Box除了将其数据存储在堆上之外,没有性能开销。
让我们看看如何使用盒子在堆上存储i32值。
fn main() {
let var_i32 = 5;
//stack
let b = Box::new(var_i32);
//heap
println!("b = {}", b);
}
b = 5
为了访问变量所指向的值,请使用解引用。 *用作取消引用运算符。让我们看看如何对Box使用取消引用。
fn main() {
let x = 5;
//value type variable
let y = Box::new(x);
//y points to a new value 5 in the heap
println!("{}",5==x);
println!("{}",5==*y);
//dereferencing y
}
变量x是具有值5的值类型。因此,表达式5 == x将返回true。变量y指向堆。要访问堆中的值,我们需要使用* y解除引用。 * y返回值5。因此,表达式5 == * y返回true。
true
true
标准库提供的Deref特性要求我们实现一种名为deref的方法,该方法借用self并返回对内部数据的引用。下面的示例创建一个结构MyBox ,这是一个通用类型。它实现了特征Deref 。此特征有助于我们使用* y访问y包裹的堆值。
use std::ops::Deref;
struct MyBox(T);
impl MyBox {
// Generic structure with static method new
fn new(x:T)-> MyBox {
MyBox(x)
}
}
impl Deref for MyBox {
type Target = T;
fn deref(&self) -> &T {
&self.0 //returns data
}
}
fn main() {
let x = 5;
let y = MyBox::new(x);
// calling static method
println!("5==x is {}",5==x);
println!("5==*y is {}",5==*y);
// dereferencing y
println!("x==*y is {}",x==*y);
//dereferencing y
}
5==x is true
5==*y is true
x==*y is true
Drop特性包含drop()方法。当实现此特征的结构超出范围时,将调用此方法。在某些语言中,程序员每次使用智能指针实例完成操作时,都必须调用代码以释放内存或资源。在Rust中,您可以使用Drop trait实现自动内存释放。
use std::ops::Deref;
struct MyBox(T);
impl MyBox {
fn new(x:T)->MyBox{
MyBox(x)
}
}
impl Deref for MyBox {
type Target = T;
fn deref(&self) -< &T {
&self.0
}
}
impl Drop for MyBox{
fn drop(&mut self){
println!("dropping MyBox object from memory ");
}
}
fn main() {
let x = 50;
MyBox::new(x);
MyBox::new("Hello");
}
在上面的示例中,当我们在堆中创建两个对象时,drop方法将被调用两次。
dropping MyBox object from memory
dropping MyBox object from memory