Rust 学习笔记:Drop trait

Rust Trait 深度解析:从泛型约束到动态分发 特质(Trait)是Rust中实现行为抽象的核心机制,它通过定义方法签名让不同类型共享同一套接口契约。理解Trait的底层原理——包括trait bound的静态分发、dyn Trait的动态分发、关联类型以及生命周期约束——是掌握Rust泛型编程和高级抽象的关键。借助标准库trait与derive宏,开发者可以优雅地实现运算符重载、资源管理(Drop)和默认行为;而特征对象(Box<dyn Trait>)则让多态容器成为可能。无论是编写可复用库,还是设计大型系统架构,合理运用trait都能显著提升代码的扩 阅读详情

Rust 学习笔记:Drop trait

Rust 学习笔记:Drop trait

智能指针模式的第二个重要特性是 Drop,它允许自定义当值即将超出作用域时发生的事情。可以在任何类型上提供 Drop trait 的实现。

在实现智能指针时几乎总是使用 Drop trait。例如,当删除 Box<T> 时,它将释放该指针所指向的堆上的空间。

Drop trait 要求实现一个 drop 方法,该方法接受对 self 的可变引用。

为了了解 Rust 何时调用 drop,编写一个示例如下:

struct CustomSmartPointer {
    data: String,
}

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

fn main() {
    let c = CustomSmartPointer {
        data: String::from("my stuff"),
    };
    let d = CustomSmartPointer {
        data: String::from("other stuff"),
    };
    println!("CustomSmartPointers created.");
}

我们在 CustomSmartPointer 上实现了 Drop trait,drop 方法将在 CustomSmartPointer 类型的实例超出作用域时自动被调用。

Drop trait 在 prelude 中,无需手动引入。

程序输出:

在这里插入图片描述

我们发现,变量的删除顺序与创建的顺序相反。

Drop trait 的全部意义在于它是自动处理的。

Rust 不允许手动调用 Drop trait 的 drop 方法。

修改之前的代码:

fn main() {
    let c = CustomSmartPointer {
        data: String::from("some data"),
    };
    println!("CustomSmartPointer created.");
    c.drop();
    println!("CustomSmartPointer dropped before the end of main.");
}

报错:

在这里插入图片描述

此错误消息指出不允许显式地调用 drop 方法,因为 Rust 在 main 函数末尾自动调用 drop 方法。

错误消息使用术语析构函数,这是用于清理实例的函数的通用编程术语。Rust 中的 drop 函数是一个特殊的析构函数。

如果希望在值的作用域结束之前强制删除值,则必须调用标准库提供的 std::mem::drop 函数。

std::mem::drop 函数不会干扰 Rust 的自动清理机制。因为该函数会接管值的所有权并销毁,不会导致 double free error。

修改之前的代码:

fn main() {
    let c = CustomSmartPointer {
        data: String::from("some data"),
    };
    println!("CustomSmartPointer created.");
    drop(c);
    println!("CustomSmartPointer dropped before the end of main.");
}

程序输出:

在这里插入图片描述

从输出可以看出,CustomSmartPointer 示例在 main 函数结束前被删除。

有了 Drop trait 和 Rust 的所有权系统,可以实现资源的自动释放。确保引用始终有效的所有权系统还确保仅在值不再使用时调用 drop 一次。

「Rust笔记」Rust之Drop介绍 现在我们讨论了 trait,让我们看看一个由 Rust 标准库提供的特殊 trait,Drop。Droptrait 提供了一个当一个值离开作用域后运行一些代码的方法。例如: struct HasDrop; impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); } } fn main() { let x = HasDrop; // Do stuff. }... 阅读详情

相关推荐

PVE(Proxmox VE)添加VMware Esxi并迁移虚拟机

跨平台迁移虚拟机:从VMware虚拟化平台迁移虚拟机到PVE平台。

VEGETA的博客 7714

【Rust 基础篇】Drop Trait 清理代码

Drop trait 需要实现一个drop方法,该方法在值离开作用域时被调用。通过在drop方法中编写清理代码,我们可以控制类型在销毁时的行为。Drop trait 的实现是自动的,编译器会根据类型的所有权和生命周期进行自动插入。本篇博客详细介绍了 Rust 中 Drop trait 的使用方法和特性。通过实现 Drop trait,我们可以自定义类型在销毁时的清理逻辑,例如释放资源或执行必要的操作。希望本篇博客对你理解和应用 Rust 中的 Drop trait 有所帮助。

繁依Fanyi的博客 1265

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

总结 Rust 常用内置 trait

Rust 常用的内置 trait。

编程回响 1439

Cursor 团队代码规范与开发规则

本文提出了一套 Cursor 项目开发规范,涵盖代码结构、命名、日志、测试等关键环节,旨在提升代码质量和团队协作效率。核心规则包括:文件不超过2000行、函数不超过80行;变量命名禁用无意义单词;日志只记录关键信息;配置项禁止硬编码;依赖和敏感信息统一管理;核心逻辑测试覆盖率≥80%;Git提交遵循Conventional Commits规范。通过一个车辆数据处理函数的改造案例,展示了从"不规范"到"规范"的代码优化过程,体现了拆分函数、常量管理、错误处理等规范的实际

1255

别再死记硬背注意力机制了!用Python+PyTorch从零实现一个HAN(Hierarchical Attention Network)

本文详细介绍了如何使用Python和PyTorch从零实现Hierarchical Attention Network(HAN),通过代码级解析帮助读者深入理解层次注意力机制。文章涵盖词级和句子级注意力层的构建、完整HAN架构的实现、训练技巧及注意力可视化方法,特别适合希望掌握高级NLP技术的开发者。

weixin_28744423的博客 161

我的RUST学习—— 【第十五章 15-3】Drop Trait

对智能指针第二重要的Trait是 Drop Trait,其作用是在值离开作用域时执行一些代码,比如释放资源。 其实 Drop 可以在任何类型上实现,不过它总是用于实现智能指针。比如Box自定义Drop 用于释放堆空间。 drop 方法 我们只需要给类型实现 drop 方法即可。Drop trait 包含在了preclude中,不需要引入。 struct CustomSmartPointer { data: String, } impl Drop for CustomSmartPointer {

swallowblank的博客 394

告别音质玄学:实测ACM8625S搭配杰理AC695x,如何通过寄存器精准调出好声音

第一次听到ACM8625S驱动音箱发出的声音时,我有些失望——这个被厂商宣传为"高保真数字功放"的芯片,默认配置下的表现甚至不如一些廉价模拟功放。经过两周的反复调试,最终配置使这款售价不到200元的音箱达到了接近专业监听设备的音质水平。特别是在鼓点和电吉他表现上,既保持了足够的冲击力,又不会掩盖人声细节。例如,当频率响应曲线在10kHz有+2dB提升时,多数评测者认为听感最佳,尽管这会使THD略微增加0.05%。虽然厂商提供的配置工具能快速生成基础代码,但想要获得最佳音效还需要手动优化。

weixin_29655587的博客 354

【Rust】——使用Drop Trait 运行清理代码和Rc<T> 引用计数智能指针

🎯使用Drop Trait 运行清理代码 🎃通过std::mem::drop提早丢弃值 🎯Rc 引用计数智能指针 🎃使用Rc共享数据 🎃克隆Rc会增加引用计数

shsjssnn的博客 1814

Ubuntu18.04下Carla安装——经验史

Ubuntu下的Carla安装

m0_51267207的博客 2678

LLC 谐振变换器开发设计1

本文档详细介绍了基于DSP28335的LLC谐振变换器开发设计。系统采用频率调制(FM)控制方式,实现高效率、高功率密度的隔离型DC/DC变换。文档阐述了LLC拓扑结构和工作原理,给出了谐振频率、品质因数等关键参数的计算公式。硬件设计包括功率器件选型和采样电路实现,软件部分提供了DSP28335的核心控制算法和代码示例,涵盖频率转换、PI控制和PWM生成。系统还设计了启动策略和保护机制,确保可靠运行。该设计实现了主开关零电压开通和低纹波输出特性。

329

rust实战系列七十八:析构函数

std::ops::Drop::drop(&mut self)的参数类型是&mut Self,采用的是可变。Drop::drop()方法是一个trait中定义的方法,当变量的生命周期结束的时候,2)std::mem::drop(_x:T)的参数类型是T,采用的是move语义;因此,对于Copy类型的变量,对它调用std::mem::drop函数是没有意义。那么,标准库中的std::mem::drop函数是怎样实现的呢?1)std::mem::drop()函数是一个独立的函数,不是某个类型的成员方。

Mr_Roki的博客 1386

HTML5+CSS3+JS小实例:扇形展开折叠菜单

你肯定见过那种圆形浮动按钮(FAB),点一下弹出几个选项。大部分实现就是菜单项从底下往上"弹"出来,排成一列——能用,但没啥记忆点。后来我看到 Path 那个经典的扇形菜单,点一下,五个按钮像花瓣一样从中心散开,每个带不同的延迟和弹性曲线。当时就觉得:这才对嘛,交互就该有点"戏剧性"。今天拆一个纯手写版本,HTML + CSS + JS,不依赖任何库。六菜单项、扇形 144° 展开、弹性过渡、点击关闭、键盘可达——该有的都有。

艾恩小灰灰的博客 164

Rust Drop trait 实践:资源清理不只是关文件句柄

Drop trait 是 Rust 区别于其他语言最实用的特性之一。它把"资源清理"这件事从"记得手动写"变成了"忘记写也不会漏"。文件句柄、锁、连接、临时文件,这些在 C 里很容易因为疏忽导致泄漏的场景,在 Rust 里只要你正确地实现了 Drop,编译器就会帮你处理。如果要从这篇文章带走一句话,那就是:Drop 里永远不要 panic,永远用let _ =善待可能出错的操作。

no1coder的博客 2145

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Rust自学】15.4. Drop trait:告别手动清理,释放即安全

在某些语言中(比如C/C++),对于某些类型,程序员每次使用完这些类型的实例时都必须写代码来释放内存或资源。如果忘记了,系统可能会过载并崩溃。在Rust中,程序员可以指定每当值超出范围时运行特定的代码,编译器将自动插入此代码。

A Rookie in San Domenico School 1061

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Rust 的 Drop Trait

假设我们需要管理一个外部资源,例如打开的文件描述符或数据库连接。我们可以使用Dropprintln!println!println!} // 作用域结束,自动调用 drop()这正体现了 Rust 的确定性析构(deterministic destruction)——即对象在离开作用域时立即被清理,不依赖 GC 或延迟回收。

m0_54376877的博客 431

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Rust Drop Trait 与资源清理机制:RAII 哲学的完美实践引言

摘要:Rust通过Drop trait完美实现了RAII资源管理机制,将资源生命周期与对象作用域严格绑定。文章深入解析了Drop trait的确定性析构特性,并通过数据库连接池案例展示了其实际价值:自动归还有效连接、避免资源泄漏、与所有权系统有机结合。同时指出使用中的注意事项,如避免panic和循环引用。Drop trait使资源管理从运行时负担转变为编译时保证,体现了Rust系统级编程的安全性和高效性特性。

paipaiqi的博客 1462

Rust:Drop trait与资源清理机制

Drop trait 不仅是语言特性,更是 Rust内存安全哲学的集中体现。它将资源管理从"程序员的负担"转化为"编译器的保证"。通过理解 Drop 的深层设计,开发者能写出既安全又高效的系统代码。

2501_94018667的博客 721

Rust Drop Trait 与资源清理机制:确定性析构的优雅实现

本文深入探讨了 Rust 中 Drop trait 的实现原理和应用场景。Drop trait 是 Rust 资源管理的核心机制,通过 RAII 模式实现资源的自动释放。文章分析了 Drop 的核心机制,包括调用时机、执行顺序以及与所有权系统的紧密集成。同时介绍了 Drop 在文件资源管理、RAII 守卫等场景的应用模式,并指出了与 Copy trait 互斥、循环引用导致泄漏等限制。最后讨论了 ManuallyDrop 等高级技巧,为编写可靠的 Rust 资源管理代码提供了实践指导。

超哥的博客 1383

rust 面向对象、trait

给结构体添加方法有2种,一种是直接实现,一种的带trait的实现。直接实现的方式中,数据和方法是对应的。带trait的实现中,trait是一组可以被共享的行为,只要实现了特征,你就能使用这组行为。

nameofcsdn的博客 1668

Rust Drop Trait 深度解析:确定性资源清理的艺术

在系统编程中,**资源管理**是永恒的主题。从文件句柄到数据库连接,从内存申请到网络套接字,每一个资源的获取都必须对应一个释放操作。Rust 通过 **Drop trait** 和所有权系统的结合,实现了**确定性的、自动的、安全的资源清理机制**。这种设计完美地解决了困扰 C++ 程序员数十年的"谁负责释放资源"的问题,又避免了垃圾回收器的不可预测停顿。理解 Drop trait 的工作原理,是掌握 Rust 系统编程的基础!🎯

syn_1111的博客 722

Rust E0040 详解:为什么不能手动调用析构函数,以及 std::mem::drop 的正确用法

在 Rust 中,`Drop` trait 的 `drop` 方法只能由编译器在值离开作用域时自动调用,任何显式的 `x.drop()` 方法调用都会触发编译错误 E0040("explicit use of destructor method")。本文基于 Rust 官方错误代码文档 [E0040.md](https://link.gitcode.com/i/db75030e9bb02f3f5

gitblog_01026的博客 756

在Rust中实现Drop trait的注意事项有哪些?

当为一个类型实现Drop trait 时,需要注意 Rust 的所有权规则。在drop方法中,编译器会自动将对象的可变引用&mut self传递进来。这意味着在drop方法中,你可以对对象进行清理操作,例如释放内存、关闭文件等。但是,不能在drop方法中转移对象的所有权,因为这会违反所有权规则。如果尝试在drop方法中返回self或者将self赋值给其他变量来转移所有权,编译器会报错。

xixixixixixixi21的博客 797

栈溢出的原因及解决办法_Rust 实现Drop trait 避免堆栈溢出

在Rust中,每一个变量内存被释放时,都会调用他自己的析构函数(Drop trait中的drop方法)。一般情况下,我们不需要也没必要自己实现Drop trait, 编译器会给我们帮忙实现一个默认的。但如果你定义的结构体包含递归的数据结构,那就要小心了,比如下面的struct A { children: Option<Box>}fn main() {let mut li...

weixin_39526185的博客 1111

comprehensive-rust 课程精讲:Copy Trait —— 隐式按位拷贝的语义、约束与实践准则

Copy 是 Rust 标准库中负责“隐式按位拷贝”的核心标记 Trait,它决定了赋值、传参与返回时值是被移动还是被自动复制。本文基于 comprehensive-rust 课程中 [common-traits/copy.md](https://link.gitcode.com/i/83308773c4df21ba30ae3301b6123c55) 的讲解,结合课程中 [memory-manag

gitblog_01194的博客 807

Drop Trait:Rust 如何在“死亡”中构建确定性

Rust的Drop特性实现了资源管理的确定性终结。通过将资源释放与作用域绑定,Drop确保了每个资源都有明确的生命周期终点,解决了传统编程中资源泄漏、双重释放等问题。它不仅是析构函数,更是责任履行协议,要求资源拥有者必须负责其完整生命周期。Drop的确定性设计使得文件、锁、线程等资源管理更加可靠,特别适合高要求领域。Rust通过限制Drop类型复制、明确析构顺序等规则,避免逻辑矛盾。即使在panic场景下,Drop仍保持行为可预测。这种设计哲学体现了"拥有即负责"的理念,为不确定的软件世

已黑化的小白的博客 995
上一篇: Rust 学习笔记:Rc<T>
下一篇: Rust 学习笔记:RefCell<T> 和内部可变性模式
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值