Rust中Drop

起因

Rust中是怎么释放资源呢?是通过Drop trait 进行释放资源的? drop 有点类似c++的析构函数.

Drop trait声明

Drop trait目前源码在core/ops/drop.rs下,
#[lang = "drop"]
#[stable(feature = "rust1", since = "1.0.0")]
pub trait Drop {
    #[stable(feature = "rust1", since = "1.0.0")]
    fn drop(&mut self);
}

Drop trait

///# 结构体
///# 定义结构体,通过#[derive(Debug)]注解,才能让println!打印结构体内容
#[derive(Debug)]
struct People {
    id: u32,
    //id
    name: &'static str,
    //姓名 字符串
    sex: &'static str, //性别
}

/// 给People实现Drop 
/// 在离开变量所在作用域的时候,调用
impl Drop for People{
    fn drop(&mut self){
        println!("id={},name={} leave",self.id,self.name);
    }
}
fn main() {
    
    //let val = mylib::sum(10,30);
    //println!("val={}",val);

    let a = People{name:"tom",id:1,sex:"男"};
    {
        let b = People{name:"jim",id:2,sex:"男"}; //变量b在离开作用域的时候,调用drop
    }


    println!("Hello, world!");
}

在离开所在作用域的时候,调用drop

变量b在离开所在作用域的时候,自动释放;

变量a也是在离开作用域的时候自动释放,只不过变量a的作用域是在main执行完时,进行释放的.


手动资源释放

use std::mem::drop;  //drop所在包
fn main() {
    
    //let val = mylib::sum(10,30);
    //println!("val={}",val);

    let a = People{name:"tom",id:1,sex:"男"};
    drop(a);  //调用之后,a释放在b之前
    {
        let b = People{name:"jim",id:2,sex:"男"}; //变量b在离开作用域的时候,调用drop
    }


    println!("Hello, world!");
}

通过手动方式调用drop,对资源进行释放

通过手动drop实现了变量a的资源释放.并且在变量b所在的作用域之前释放资源.

很多类型实现Drop trait

Rust内置的很多类型都实现了Drop trait
秋风 2020-03-01