48_Drop Trait

1. 概述

当一个数据类型实现Drop Trait之后,可以让我们自定义当值离开作用域时发生的动作。通常发生的动作包括:文件、网络资源的释放等。任何类型都可以实现Drop trait,Drop Trait只要求实现drop方法,drop的参数是对self的可变引用。Drop trait在预导入模块(prelude)里。

我们先看一个示例代码:

rust 复制代码
struct CustomartPointer {
    data: String,
}

impl Drop for CustomartPointer {
    fn drop(&mut self) {
        println!("Dropping CustomSmartPointer with data `{}` !", self.data)
    }
}

fn main() {
    let c = CustomartPointer { data: String::from("my  stuff") };
    let d = CustomartPointer { data: String::from("other  stuff") };

    println!("CusomSmartPointers created")
}

执行程序之后,输出以下内容

bash 复制代码
CusomSmartPointers created
Dropping CustomSmartPointer with data `other  stuff` !
Dropping CustomSmartPointer with data `my  stuff` !

这表明,两个变量离开作用域的时候调用了drop方法。

2. 使用std::mem::drop来提前drop值

我们很难直接自动调用drop功能,其实也没有必要,因为Drop trait的目的就是进行自动的释放逻辑处理。

此外,rust也不允许手动调用Drop trait的drop方法,但可以调用标准库的std::mem::drop函数,该函数也在预导入模块中,来提前drop值,相当于提前调用了Drop trait的drop方法。

如下示例代码:

rust 复制代码
let c = CustomartPointer { data: String::from("my  stuff") };
drop(c);
let d = CustomartPointer { data: String::from("other  stuff") };

println!("CusomSmartPointers created")

这时候,输入内容如下

bash 复制代码
Dropping CustomSmartPointer with data `my  stuff` !
CusomSmartPointers created
Dropping CustomSmartPointer with data `other  stuff` !

这时候,你可能会有疑问:提前调用drop函数,那么会不会出现重复释放(double free)的错误呢?答案是不会的,rust的设计很安全,它的所有权系统会保证引用的有效,而drop方法也只会在不再使用该值的时候只调用一次。

相关推荐
椒盐螺丝钉1 小时前
Vue Router应用:组件跳转
前端·javascript·vue.js
顾安r1 小时前
11.20 开源APP
服务器·前端·javascript·python·css3
敲敲了个代码2 小时前
CSS 像素≠物理像素:0.5px 效果的核心密码是什么?
前端·javascript·css·学习·面试
少云清2 小时前
【软件测试】5_基础知识 _CSS
前端·css·tensorflow
倔强青铜三2 小时前
AI编程革命:React + shadcn/ui 将终结前端框架之战
前端·人工智能·ai编程
天外飞雨道沧桑3 小时前
前端开发 Cursor MCP 提效工具配置
前端·vscode·ai编程·开发工具·cursor
朱哈哈O_o3 小时前
前端通用包的作用——jquery篇
前端
葡萄城技术团队3 小时前
纯前端驱动:在线 Excel 工具的技术革新与实践方案
前端·excel
芳草萋萋鹦鹉洲哦3 小时前
【vue】调用同页面其他组件方法几种新思路
前端·javascript·vue.js
巴啦啦臭魔仙3 小时前
uniapp scroll-view自定义下拉刷新的坑
前端·javascript·uni-app