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 小时前
如何评价VTJ.PRO?
前端·架构·ai编程
Mh2 小时前
鼠标跟随倾斜动效
前端·css·vue.js
小码哥_常3 小时前
Kotlin类型魔法:Any、Unit、Nothing 深度探秘
前端
Web极客码4 小时前
深入了解WordPress网站访客意图
服务器·前端·wordpress
幺风4 小时前
Claude Code 源码分析 — Tool/MCP/Skill 可扩展工具系统
前端·javascript·ai编程
vjmap4 小时前
唯杰地图CAD图层加高性能特效扩展包发布
前端·gis
ZC跨境爬虫5 小时前
3D 地球卫星轨道可视化平台开发 Day7(AI异步加速+卫星系列精简+AI Agent自动评论)
前端·人工智能·3d·html·json
skilllite作者5 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
ID_180079054735 小时前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json
M ? A5 小时前
Vue 动态组件在 React 中,VuReact 会如何实现?
前端·javascript·vue.js·经验分享·react.js·面试·vureact