如何验证Rust中的字符串变量在超出作用域时自动释放内存?

embedded/2024/10/22 14:25:15/

讲动人的故事,写懂人的代码

在公司内部的Rust培训课上,讲师贾克强比较了 Rust、Java 和 C++ 三种编程语言在变量越过作用域时自动释放堆内存的不同特性。

Rust 通过所有权系统和借用检查,实现了内存安全和自动管理,从而避免了大部分内存泄漏。Rust 自动管理标准库中数据类型(如 BoxVecString)的堆内存,并在这些类型的变量离开作用域时自动释放内存,即使程序员未显式编写清理堆内存的代码。

只有当程序员实现自定义的数据类型,并且该类型拥有需要手动管理的资源时,才需要在 drop 函数中编写清理代码。如果在这种情况下忘记了编写清理代码,确实可能导致资源泄漏,包括但不限于内存泄漏。

相比之下,Java 主要由垃圾回收器(GC)控制内存管理,而 C++ 则需要程序员通过构造函数和析构函数手动控制内存的分配和释放。

席双嘉提出问题:“我对Rust中的字符串变量在超出作用域时自动释放内存的机制非常感兴趣。但如何能够通过代码实例来验证这一点呢?”

在这里插入图片描述

贾克强说这是一个好问题,可以作为今天的作业。他请对这个问题感兴趣的同学,在课下找AI编程助手小艾来完成这个作业。

赵可菲对这个问题颇感兴趣。在小艾的帮助下,她迅速完成了代码编写并且成功运行。为了让Rust新手能够理解,她请小艾在代码中的每一行关键语句前加上了注释。此外,她还在main函数后添加了这个程序的运行结果输出,如代码清单1-1所示。

代码清单1-1 验证当字符串变量超出范围时,Rust会自动调用该变量的drop函数

rust">// 使用 jemallocator 库中的 Jemalloc 内存分配器
use jemallocator::Jemalloc;// 用属性(用于为代码的特定部分提供元信息的注释)定义一个全局的内存分配器,使用 Jemalloc 作为系统的全局内存分配器
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;fn main() {{// 进入一个新的作用域,作用域是用大括号 `{}` 包围的代码块// 创建一个包含 100M 大字符串的自定义结构体let _large_string_owner = LargeStringOwner::new(100_000_000); // 100 MB// 打印创建大字符串后消息println!("Large string created.");} // 这里作用域结束,`large_string_owner` 变量自动销毁,`drop` 函数被调用// 打印离开作用域后的消息println!("Large string scope ended.");
}
// 该程序运行后的输出为:
// Large string created.
// Dropping LargeStringOwner, releasing large string memory.
// Large string scope ended.// 自定义一个包含大字符串的结构体,并实现 Drop trait
struct LargeStringOwner {// 包含一个字符串字段,但允许未使用(避免编译器警告)#[allow(dead_code)]content: String,
}impl LargeStringOwner {// 为结构体实现一个新的构造函数,接受字符串大小作为参数

http://www.ppmy.cn/embedded/51215.html

相关文章

Oracle 入门--前提

目录 1.sqlplus 2.dual是什么? 3.SQL语句的种类 4.Oracle是如何工作的 5.Oracle查看配置文件 6.修改配置文件 7.常用的参数设置 1.sqlplus 管理数据库:启动,关闭,创建,删除对象......查看数据库的运行状态&…

【小程序】WXSS模板样式

目录 WXSS模板样式 概述 什么是WXSS WXSS 和 CSS 的关系 rpx 什么是rpx尺寸单位 rpx的实现原理 样式导入 import 语法格式 全局样式和局部样式 全局样式 局部样式 全局配置 全局配置文件及常用的配置项 window 小程序窗口的组成部分 window节点常用的配置项…

中学理化生实验室建设及配置要求

在中学物理、化学、生物等学科教学中,实验占据了非常重要的地位,是整个教学过程中不可或缺的部分。很多理科教学需要在实验室完成演示和学习任务,实验室也是保证教学计划得以实施的物质基础。因此,中学理化生实验室建设标准与否&a…

echarts地图修改图例

要求:根据数据排名,前三名点亮橙色,其他地区根据数值分配不同颜色,并且要加上单位 效果图如下: 实现方法如下: visualMapFormat(list) {//先将数据按从大到小的顺序排列//当list长度为1时,点亮…

html做一个雷达图的软件

要实现一个在线输入数据并生成雷达图的功能&#xff0c;可以使用HTML表单和JavaScript来处理用户输入的数据。以下是一个示例代码&#xff0c;演示了如何实现这个功能&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"…

android 对不同日期和时间的格式方法的封装

break; default: result “星期一”; break; } return result; } /** 判断两个时间是否属于同一天 param time1 param time2 return */ public boolean isSameDay(long time1, long time2) { Calendar calen Calendar.getInstance(); calen.setTimeInMillis(t…

力扣42.接雨水

力扣42.接雨水 前后缀数组 对于每个一个位置 求其前面最高高度pre_max[i] max(pre_max[i-1] , h[i])和后面最高高度suf_max[i] max(suf_max[i1] , h[i])当前i处的水容量 为min(pre_max[i] , suf_max[i]) - h[i] class Solution {public:int trap(vector<int>& …

virtualbox中共享盘的使用

Windows通过共享盘向虚拟机&#xff08;ubuntu&#xff09;传输文件 第一步&#xff1a; 第二步&#xff1a; 三。完成