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方法也只会在不再使用该值的时候只调用一次。

相关推荐
AI浩7 小时前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
涔溪7 小时前
CSS 网格布局(Grid Layout)核心概念、基础语法、常用属性、实战示例和进阶技巧全面讲解
前端·css
2401_878454537 小时前
浏览器工作原理
前端·javascript
西陵7 小时前
为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
前端·架构·ai编程
by__csdn8 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
天天扭码9 小时前
前端如何实现RAG?一文带你速通,使用RAG实现长期记忆
前端·node.js·ai编程
Luna-player9 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05199 小时前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys10 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
奇舞精选10 小时前
GELab-Zero 技术解析:当豆包联手中兴,开源界如何守住端侧 AI 的“最后防线”?
前端·aigc