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

news2024/10/7 18:30:14

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

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

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

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

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

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

在这里插入图片描述

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

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

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

// 使用 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.coloradmin.cn/o/1862060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3学习笔记<->开发环境安装

背景 公司开始做产品开发,前端就选择使用了vue,替换了传统的jsp。公司要求每个开发人员都要前后端都可以开发,于是就开始学习vue了。 安装环境 安装node.js node.js下载地址:node.js下载地址 安装:选在安装路径&…

晶方科技:台积电吃饱,封装迎春?

半导体产业链掀起涨价潮,先进封装迎接利好。 这里我们来聊国内先进封装企业——晶方科技。 近期,由于产能供不应求,台积电决定上调先进封装产品价格,还表示订单已经排到2026年。 大哥吃不下了,剩下的订单全都是空间。…

【golang学习之旅】复杂数据类型——指针 函数

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

【嵌入式Linux】<总览> 进程间通信(更新中)

文章目录 前言 一、管道 1. 概念 2. 匿名管道 3. 有名管道 二、内存映射区 1. 概念 2. mmap函数 3. 进程间通信(有血缘关系) 4. 进程间通信(没有血缘关系) 5. 拷贝文件 前言 在文章【嵌入式Linux】<总览&a…

RAID详解及配置实战

目录 一、RAID磁盘阵列及详解 1.1 了解RAID 1.1.1 简单理解 1.1.2 对比了解 1.2 RAID磁盘阵列介绍 1.3 RAID功能实现 1.4 RAID实现的方式 1.5 RAID级别详解 1.5.1 RAID -0 1.5.2 RAID -1 1.5.3 RAID -5 1.5.4 RAID -10(RAID 10) 1.6 阵列卡…

2024年最新通信安全员考试题库,随时在线刷题

46.劳动防护用品不同于一般的商品,直接涉及到劳动者的生命安全和身体健康,故生产经营单位为从业人员提供的劳动防护用品必须符合( )或行业标准。 A.地方标准 B.国家标准 C.消防标准 D.LA劳安认证 答案:B 47.矿山、金属冶炼、…

本地可以Run大模型吗?Llama3?安排!

➡️ 前言 本地可以跑大模型吗? ChatGPT发布之后,引起了AI领域剧烈震动,从2023年3月百度发布新一代大预言模型文心一言开始,大模型如雨后春笋般不断涌现,国内阿里巴巴的通义千问、华为的盘古大模型、科大讯飞的星火认知大模型、…

大学网页制作作品1

作品须知:1.该网页作品预计分为5个页面(其中1个登录页面,1个首页主页面,3个分页面),如需要可自行删改增加页面。(总共约800行html,1200行css,100行js) 2.此网页源代码只用于学习和模…

面相对象程序设计

面相对象程序设计包含内容如下 局域网聊天程序设网页浏览器设计电子日历记事本的设计 以其中的一个的报告进行举例 1需求与总体设计 1 1.1需求分析 1 1.2总体设计方案 1 1.2.1系统功能分析以及功能表 1 1.3系统类图的关系以及表之间的联系 2 2详细设计 3 2.1 Manag…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

RS232自由转Profinet协议网关模块连接1200PLC与扫码枪通讯及手动清零案例

一、RS232和Profinet这两种通讯接口的特点和应用场景: RS232是一种串行通讯接口标准,常用于连接计算机和外部设备,传输速率较低但稳定可靠。Profinet则是一种工业以太网通讯协议,具有高速、实时性强的特点,适用于工业…

群智优化:探索BP神经网络的最优配置

群智优化:探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到,而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征: 鸢尾花数据集包含了150个样本&#…

【计算机毕业设计】167校园失物招领微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

适合实习生使用的工作笔记软件

作为一名初入职场的实习生,我每天都面临着海量的信息和工作任务。刚开始时,我常常手忙脚乱,生怕漏掉任何重要细节。对于实习生来说,好的工作笔记软件不仅能帮助我们系统地整理工作信息,还能提高工作效率,确…

数据结构---二叉树前中后序遍历

1. 某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为() A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA 2. 二叉树的先序遍历和中序遍历如下:先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

Day60 代码随想录打卡|回溯算法篇---组合

题目(leecode T77): 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 方法:本题最直观的解法是使用暴力for循环遍历法,根据k的大小定for循环的嵌套次数&…

Java高级重点知识点-14-Set接口、HashSet底层原理讲解

文章目录 Set接口 (HashSet 、LinkedHashSet)HashSet底层原理(重点理解) Set接口 (HashSet 、LinkedHashSet) 无序不重复 HashSet集合 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。 public class HashSetDemo {publ…

经典游戏案例:仿植物大战僵尸

学习目标:仿植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum…

数字图像分析(第一部分)

文章目录 第2章 图像数字化数字化采样与量化像素的邻域像素的距离图像采集网络**离散直线性**距离变换**第3章 图像变换可分离和正交图像变换2D DFT变换及其本质**哈达玛变换KL变换(PCA)第4章 形态学二值形态学膨胀和腐蚀开启和闭合击中-击不中变换二值形态学实用算法噪声滤除目…