第7章 站在对象模型的尖端2: 异常处理
1.异常处理(Exception Handling)
C++的异常处理由三个主要组成部分构成:throw表达式、catch子句和try块。当异常被抛出时,程序控制权会转移,并且会沿着调用堆栈回溯,直到找到匹配的catch子句。在此过程中,局部对象的析构函数会被调用,称为"堆栈展开"(stack unwinding)的过程。
2.异常处理的支持
当异常发生时,编译系统需要做:
- 检验发生throw操作的函数。
- 决定throw操作是否发生在try区段中:判断异常是否在try块中抛出。
- 如果异常在try块中抛出,编译系统会将异常类型与每一个catch子句进行比较。
- 如果找到匹配的catch子句,控制权转移到该catch子句。
- 如果throw不在try块中,或者没有匹配的catch子句,编译系统会:
(a) 摧毁所有活动的局部对象。
(b) 从堆栈中奖目前的函数"unwind"掉
(c) 继续到堆栈中的下一个函数,并重复上述步骤2-5。
3.异常类型的比较
对于每个抛出的异常,编译器会生成一个类型描述符,其中包含异常类型的编码信息。如果异常类型是派生类型,描述符中还会包含所有基类的类型信息,包括私有和保护基类。编译器还为每个catch子句生成一个类型描述符。运行时异常处理器会将抛出对象的类型描述符与每个catch子句的类型描述符进行比较,直到找到匹配的catch子句或堆栈被完全展开。
4.异常对象的生命周期
当异常对象在运行时被抛出时,会发生以下过程:
异常对象被创建并通常放在一个特殊的异常数据堆栈中。传递给catch子句的是异常对象的地址、类型描述符(或一个返回类型描述符的函数指针)以及可能的异常对象描述符。
catch子句中的异常对象
考虑以下catch子句
catch(exPoint p) {// do somethingthrow;
}
如果异常对象的类型是exVertex,派生自exPoint,那么这个catch子句会匹配。在这种情况下,p会发生以下变化:p会被初始化为异常对象的副本,就像函数参数一样。如果exPoint有复制构造函数和析构函数,它们会应用于p。由于p是一个对象而不是引用,复制时会进行切片(slicing),即只复制exPoint部分,丢弃exVertex特有的部分。此外,p的虚函数表指针(vptr)会被设置为exPoint的虚函数表。当再次抛出异常时,会创建一个新的临时对象,而不是使用原来的exVertex对象。原来的异常对象会被再次抛出,对p的修改会被丢弃。
如果catch子句是引用类型:
catch(exPoint &p) {// do somethingthrow;
}
在这种情况下,p是原始异常对象的引用,任何虚函数调用都会基于exVertex的实际类型,对p的修改会传递到下一个catch子句。
异常处理机制要求编译器跟踪每个函数的作用域,以便在抛出异常时能够找到匹配的catch子句来处理异常。编译器还必须提供查询异常对象类型的方法(RTTI),并且管理被抛出的对象,包括其创建、销毁和清理。假设有一个基类 BaseException 和一个派生类 DerivedException,并且我们希望在抛出DerivedException 时,能够用 BaseException 类型的 catch 子句来捕获它。
5.异常对象的类型识别(RTTI)
#include <iostream>
#include <typeinfo>
class BaseException {public:virtual ~BaseException() {}
};
class DerivedException : public BaseException {public:~DerivedException() override {}
};
void someFunction() {try {// 抛出一个 DerivedException 对象throw DerivedException();} catch (const BaseException& e) {// 使用 typeid 来检查异常的实际类型if (typeid(e) == typeid(DerivedException)) {std::cout << "Caught a DerivedException" << std::endl;} else {std::cout << "Caught a BaseException" << std::endl;}}
}
int main() {someFunction();return 0;
}
抛出一个 DerivedException 对象。由于 BaseException 是 DerivedException 的基类,我们可以使用 BaseException 类型的引用作为 catch 子句的参数来捕获这个异常。然后,我们使用 typeid 操作符来检查捕获到的异常对象的实际类型。如果异常对象是 DerivedException 类型,程序会输出 "Caught a DerivedException";否则,输出 "Caught a BaseException"。
当执行 throw DerivedException(); 语句时,一个 DerivedException 对象被创建。这个对象是一个临时对象,它被创建在堆栈上或者堆上,具体取决于编译器的实现。抛出的 DerivedException 对象需要被存储起来,直到找到合适的 catch 子句。在存储期间,对象的生命周期由异常处理机制来维护。
当异常对象被传递给 catch (const BaseException& e) 时,它并没有立即被销毁。只有当 catch 块执行完毕时,异常对象才会被销毁。如果在 catch 块内部再次抛出异常(例如 throw或者 throw e),那么原始的异常对象会被复制,并且新的副本会被传递给下一个匹配的 catch 子句。原始对象仍然会在当前 catch 块结束时被销毁。如果 DerivedException 对象包含需要特别清理的资源(比如文件句柄或网络连接),这些资源会在对象的析构函数中被释放。例如,如果我们给 DerivedException 添加一个析构函数来关闭文件句柄,那么当 DerivedException 对象被销毁时,文件句柄就会被关闭。
当一个异常被抛出时,异常处理机制需要确定异常对象的实际类型,这样才能找到匹配的catch子句。C++提供了typeid操作符和dynamic_cast,这些都是基于RTTI的特性。通过RTTI,编译器能够在运行时检查异常对象的类型,从而决定应该执行哪个catch块。
6.异常对象的生命周期管理
异常对象在抛出时被创建,在找到匹配的catch子句后被销毁。编译器需要负责确保异常对象在整个异常处理过程中得到正确的管理。
当throw表达式被执行时,一个新的异常对象会被创建,这个对象通常是一个临时对象。异常对象需要被存储,直到找到合适的catch子句。这个存储位置可能是堆栈或堆,取决于编译器的实现。一旦异常对象被传递给catch子句,它将在catch块结束时被销毁。如果catch子句中有throw语句来重新抛出异常,那么原来的异常对象会被复制,新的副本将被传递给下一个catch子句。如果异常对象包含了需要特殊清理的资源(如文件句柄或网络连接),那么在对象被销毁时,这些资源需要被正确地释放。这通常是通过对象的析构函数来完成的。
异常处理可能对程序大小和执行速度产生影响。编译器可以选择在编译时或运行时构建支持异常处理所需的数据结构。编译时构建可以提高执行速度但可能增加程序大小,运行时构建则相反。
-
在编译时构建的情况下,编译器会在编译阶段生成一个异常处理表,这个表包含了关于每个try-catch块的信息,比如它们在代码中的位置、哪些异常类型可以被捕获等。这样,当异常发生时,编译器可以非常快速地查找这个表来决定如何处理异常。
-
编译器会动态地构建异常处理信息,它可能会创建一个临时的数据结构,记录当前的调用堆栈和异常类型。然后,这个数据结构会被用来搜索匹配的catch块。如果找到了匹配的catch块,异常对象会被传递给它;如果没有找到匹配的catch块,则会继续向上搜索调用堆栈,直到找到一个匹配的catch块或到达顶层调用。
对于一些看似简单的函数,异常处理也带来了额外的复杂性。
当一个异常抛出时,函数可能需要确保某些资源被正确释放,如锁定的内存等。文章还提供了几种编写异常安全代码的技术,比如使用智能指针auto_ptr来自动管理动态分配的内存,或者封装资源获取和释放逻辑到类的构造函数和析构函数中。
// 原始的mumble函数,没有异常处理
Point* mumble() {Point *pt1, *pt2;pt1 = foo();if (!pt1) return 0;Point p; // 局部对象pt2 = foo();if (!pt2) return pt1;// ... 其他代码return pt2;
}
// 添加了异常处理的mumble函数
void mumble(void *arena) {Point *p = new Point;smLock(arena); // 锁定内存// ... 其他代码smUnlock(arena); // 解锁内存delete p;
}
// 使用try-catch块使mumble函数异常安全
void mumble(void *arena) {Point *p;p = new Point;try {smLock(arena);// ... 其他代码} catch (...) {smUnlock(arena);delete p;throw; // 重新抛出异常}smUnlock(arena);delete p;
}//使用智能指针和封装资源管理的mumble函数
void mumble(void *arena) {std::auto_ptr<Point> p(new Point);SMLock sm(arena); // 封装了锁的类// 不需要显式的解锁和删除
}
原始的 mumble 函数,没有异常处理。如果 foo() 抛出异常,那么 mumble 函数将直接终止,而不会释放任何已分配的资源。此外局部对象 p 会在函数退出时自动销毁,但如果在 p 的构造过程中抛出异常,函数会直接退出,不会执行后续的代码。
添加异常处理的mumble函数
void mumble(void *arena) {Point *p = new Point;smLock(arena); // 锁定内存// ... 其他代码smUnlock(arena); // 解锁内存delete p;
}
该函数创建了一个 Point 对象,锁定了一块内存(arena),执行一些其他代码,然后解锁内存并删除 Point 对象。
使用 try-catch 块来确保在抛出异常时,smUnlock 和 delete p 仍然会被执行。如果在 try 块中的代码抛出异常,catch 块会解锁内存并删除 Point 对象,然后重新抛出异常。如果 try 块中的代码没有抛出异常,smUnlock 和 delete p 会在 try 块结束后正常执行。
使用智能指针和封装资源管理的 mumble 函数
void mumble(void *arena) {std::auto_ptr<Point> p(new Point);SMLock sm(arena); // 封装了锁的类// 不需要显式的解锁和删除
}
auto_ptr 会在离开作用域时自动删除 Point 对象,即使在构造 Point 对象或执行其他代码时抛出异常。SMLock 类会在构造函数中锁定内存,在析构函数中解锁内存,这样即使在 try 块中的代码抛出异常,锁也会被正确地解锁。方法利用了RAII原则,确保资源在对象生命周期内得到正确管理。
原文链接:https://blog.csdn.net/m0_52043808/article/details/143589604
相关文章:
第7章 站在对象模型的尖端2: 异常处理
1.异常处理(Exception Handling) C的异常处理由三个主要组成部分构成:throw表达式、catch子句和try块。当异常被抛出时,程序控制权会转移,并且会沿着调用堆栈回溯,直到找到匹配的catch子句。在此过程中,局部对象的析构…...
不同路径——2
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。 网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的…...
电子招采软件系统,如何实现10年可追溯审计
一、在当前经济环境下,中小企业面临着巨大的生存压力,传统产业的数字化转型迫在眉睫。AI技术为企业的低成本高效发展提供了新机会,混合办公成为新常态,数据安全法的深入落实则进一步推动企业重视数据安全。区块链存证技术凭借独特…...
TS常见内置映射类型的实现及应用场景
以下是 TypeScript 在前端项目中 常用的映射类型(Mapped Types),结合具体场景和代码示例,帮助开发者高效处理复杂类型: 一、基础映射类型 1. Partial<T> 作用:将对象类型 T 的所有属性变为可选。 实…...
本地部署Deep Seek-R1,搭建个人知识库——笔记
目录 一、本地部署 DeepSeek - R1 1:安装Ollama 2:部署DeepSeek - R1模型 3:安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1:安装Ollama 1.打开Ollama下载安装 未科学上网,I 先打开迅雷再下…...
东芝2323AMW复印机安装纸盒单元后如何添加配件选项
如何添加请看下面图示: 找到设备和打印机里找到打印机图标,右键打印机属性,找到配置,添加相应配置功能;打印机属性,加上双面或者2纸盒配件选项; Word打印时,打印机名称,后…...
EasyExcel动态拆分非固定列Excel表格
使用EasyExcel动态拆分非固定列Excel表格 在Excel数据解析场景中,动态列结构拆分是典型挑战(如供应链系统中不同品类的属性字段差异较大)。传统基于POJO映射的方案无法应对列数量不固定的场景。本方案采用EasyExcel的动态模型解析和Map数据…...
开源WAF雷池本地化部署与远程查看网站安全防护的详细操作指南
文章目录 前言1.关于SafeLine2.安装Docker3.本地部署SafeLine4.使用SafeLine5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 各位建站小能手们,无论是想搭建个人博客、企业官网还是各种应用平台来推广自己的内容或产品,…...
由一个话题进入DFMEA(设计失效模式及影响分析)
前言 最近看到了知乎的一个话题“为啥撞车后总是看到雨刮器在摆动?”,联想到产品设计中的一些功能安全设计,也借此机会学习DFMEA,讨论一下我个人对于DFMEA的理解。 有纰漏请指出,转载请说明。 学习交流请发邮件 128…...
Redisson 实现分布式锁源码浅析
大家好,我是此林。 今天来分享Redisson分布式锁源码。还是一样,我们用 问题驱动 的方式展开讲述。 1. redis 中如何使用 lua 脚本? Redis内置了lua解释器,lua脚本有两个好处: 1. 减少多次Redis命令的网络传输开销。…...
机试准备第17天
今天进入图论的学习。图论只考察初试学过的算法,一般都是模版题。常见考点有图相关的数据结构——邻接表法,图的遍历 BFS DFS 并查集,单源最短路径迪杰斯特拉。图由顶点和边构成,度用来说明该顶点邻接边的数量情况。权值说明了边的…...
ABAP语言的动态编程(4) - 综合案例:管理费用明细表
本篇来实现一个综合案例:管理费用明细表。报表在实际项目中,也有一定的参考意义,一方面展示类似的报表,比如管理费用、研发费用等费用的明细,使用业务比较习惯的展示格式;另一方面正好综合运用前面学习的动…...
不像人做的题————十四届蓝桥杯省赛真题解析(上)A,B,C,D题解析
题目A:日期统计 思路分析: 本题的题目比较繁琐,我们采用暴力加DFS剪枝的方式去做,我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串,但是还是会存在19月的情况,为此还需要在CHECK函数…...
R语言零基础系列教程-01-R语言初识与学习路线
代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境,是一门用于统计计算和作图的语言。“一切皆是对象”,数据、函数、运算符、环境等等都是对象。易学,代码像伪代码一样简洁,可读性高强大的统计和可视…...
即时通讯平台测试报告
1.项目概述 项目名称:即时通讯平台 版本号:V1.0.0 测试周期:2025年2月25日--2025年3月15日 测试目标:验证核心功能(登录、注册、消息收发、用户管理、群组功能等)的稳定性和性能指标。 2. 测试范围 功…...
蓝桥杯单片机内存爆了怎么办
蓝桥杯单片机内存爆了怎么办 文章目录 蓝桥杯单片机内存爆了怎么办一、参考文章二、内存区3、keil中的体现4、分配原则5、使用示例 一、参考文章 文章1 文章2 文章3 文章4 二、内存区 1 KB(千字节) 1024 B(字节) B代表Byte,1Byte8bit,一个字节8位 …...
一周热点:微软攻克语音输入、文本输出难题-Phi-4-multimodal
微软Phi-4-multimodal模型是人工智能领域的一个重要进展,它标志着微软在多模态人工智能技术上的突破。以下是对该模型的详细解释: 模型概述 微软Phi-4-multimodal是一个能够同时处理文本、图像和语音的多模态大型语言模型。它通过创新的架构和训练方法,实现了在不同模态之间…...
量化交易学习笔记02:双均线策略
双均线策略示例 个股:中国平安 回测日期:2022-5-1至2023-5-1 短均线:5天 长无线:10天 代码: def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…...
【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题
在 WRF 中,LCZ 通过 URBPARM_LCZ.TBL 进行配置,但如果 FRC_URB2D 变量缺失,WRF 会回退到默认的 URBPARM.TBL。 主要问题概述 WRF-Model-cglc-modis-lcz_100m dataset " WARNING, THE URBAN FRACTION WILL BE READ FROM URBPARM.TBL USING DEFAULT URBAN MORPHOLOGY&q…...
Selenium 自动化测试学习总结
大概了解一下即可,现在主要用的自动化工具是 playWright,它可以录制操作。 selenium是老款自动化测试工具,仍有很多可取之处。 安装: pip install selenium即可。然后下载浏览器的驱动包,注意不是浏览器!…...
开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡!
开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡! 万相2.1开源 近日,大模型万相2.1(Wan)重磅开源,此次开源采用Apache2.0协议,14B和1.3B两个参数规格…...
Suno的对手Luno:AI音乐开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Luno Api系列|AI音乐API」第11篇
导读 今天来看下Luno Api的上传参考音频 - 方式一:通过二进制流的方式。 参考文件,主要是用于在创作的过程中,希望AI参考这个音乐的曲风和声音来进行创作,那么可以通过上传参考音乐来进行实现。 申请和使用 「已经有API的&…...
微信小程序刷题逻辑实现:技术揭秘与实践分享
页面展示: 概述 在当今数字化学习的浪潮中,微信小程序以其便捷性和实用性,成为了众多学习者刷题备考的得力工具。今天,我们就来深入剖析一个微信小程序刷题功能的实现逻辑,从代码层面揭开其神秘面纱。 小程序界面布局…...
巴耶赫利专业俄语外贸网站建设
巴耶赫利是专业俄语外贸网站建设与俄语搜索引擎Yandex SEO优化服务商。巴耶赫利致力于帮助中国品牌出海俄罗斯,打开俄罗斯市场,提升品牌在俄罗斯的知名度和美誉度。 以下是对巴耶赫利相关服务的详细介绍: 一、巴耶赫利专业俄语外贸网站建设…...
每日Attention学习25——Multi-Scale Attention Fusion
模块出处 [TCSVT 24] [link] [code] DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation 模块名称 Multi-Scale Attention Fusion (MSAF) 模块作用 双级特征融合 模块结构 模块思想 MSAF的主要思想是让网络根据损失学习特征权重,允许模型…...
前端学习记录:解决路由缓存问题
问题描述:响应路由参数的变化,使用带有参数的路由时需要注意的是,当用户从 /users/johnoy 导航到 /users/jolyne 时,相同的组件实例将会被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得…...
VSTO(C#)Excel开发10:启动和卸载顺序 事件处理 监视变化
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
代码随想录Day16
Day16 二叉树part06 LeetCode 530.二叉搜索树的最小绝对差 题目描述 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 示例 输入:root [4,2,6,1,3] 输出&…...
第15章:ConvNeXt图像分类实战:遥感场景分类【包含本地网页部署、迁移学习】
目录 1. ConvNeXt 模型 2. 遥感场景建筑识别 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 本地部署推理 3. 下载 1. ConvNeXt 模型 ConvNeXt是一种基于卷积神经网络(CNN)的现代架构,由Facebook AI Research (FAIR) 团队在2022年提出。…...
LinuX---Shell脚本创建和执行
概述: 它是一个命令行解释器,接收应用程序/用户命令,然后调用操作系统内核。 Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。 Linux提供的Shell解析器有 atguiguubuntu:~$ cat /etc/shells # /etc/shells: valid …...
django+vue3实现前后端大文件分片下载
效果: 大文件分片下载支持的功能: 展示目标文件信息提高下载速度:通过并发请求多个块,可以更有效地利用网络带宽断点续传:支持暂停后从已下载部分继续,无需重新开始错误恢复:单个块下载失败只…...
KY-038 声音传感器如何工作以及如何将其与 ESP32 连接
想为您的项目赋予声音感!然后跟着做,因为在这个项目中,我们将连接一个声音传感器,用它构建一些有趣的项目。我们使用的 KY-038 声音传感器使用电容式麦克风来检测声波,这为我们提供了稳定性和可靠性的完美平衡。因此,在本文中,我们决定将 KY-038 传感器与 ESP32 连接,并…...
深入剖析二分查找的延伸:在排序数组中查找元素的第一个和最后一个位置
深入剖析二分查找的延伸:在排序数组中查找元素的第一个和最后一个位置 引言 二分查找,作为算法界的“常青树”,以其高效性和简洁性备受青睐。然而,许多初学者仅限于使用它查找单个元素,而对其进阶应用知之甚少。今天…...
UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·
1. GameMode 与 GameState 关系描述 GameMode:定义游戏规则和逻辑,控制游戏的开始、进行和结束。GameState:存储和同步全局游戏状态,如得分、时间、胜利条件等。 联动方式 GameMode初始化GameState:GameMode在游戏…...
使用Python获取并操作1688自定义API接口
在电子商务领域,1688作为国内领先的B2B平台,提供了丰富的API接口,允许开发者获取商品信息、店铺信息等。其中,custom接口允许开发者进行自定义操作,获取特定的数据。本文将详细介绍如何使用Python调用1688的custom接口…...
【AI】现代人工智能技术的应用与发展
引言 人工智能(AI)已经深入到我们生活的各个方面,涉及医疗、教育、交通、金融等众多领域。随着技术的不断发展,AI的应用和潜力也变得愈加广泛。本文将详细介绍人工智能的应用领域,探讨未来的发展趋势,并通…...
小程序渲染之谜:如何解决“加载中...”不消失的 Bug(glass-easel)
🎉 小程序渲染之谜:如何解决“加载中…”不消失的 Bug 🎉 引言 在小程序开发中,渲染问题总能让人抓狂。😫 这次,我遇到了一个奇怪的 bug:产品详情页的内容已经正常显示,但页面却一…...
C语言结构体全面解析 | 从入门到精通
📚 C语言结构体全面解析 | 从入门到精通 整理:算法练习生| 转载请注明出处 📑 目录 结构体的定义与使用结构体变量的参数传递结构体数组结构体指针typedef关键字结构体初始化 1️⃣ 结构体的定义与使用 为什么需要结构体? 当…...
Trae与Builder模式初体验
说明 下载的国际版:https://www.trae.ai/ 建议 要选新模型 效果 还是挺不错的,遇到问题反馈一下,AI就帮忙解决了,真是动动嘴(打打字就行了),做些小的原型效果或演示Demo很方便呀ÿ…...
麒麟服务器操作系统QT系列软件工具手册
QtCreator****功能介绍 QtCreator 概述 Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 [Nokia](https://baike.baidu.com/item/Nokia/264012" /t “_blank) 收购后推出的一款新的轻量级[集成开发环境](https://baike.baidu.com/item/集成开发环境/298524” /t “_…...
【HeadFirst系列之HeadFirstJava】第18天之深入理解原型模式:从问题到解决方案(含 Java 代码示例)
深入理解原型模式:从问题到解决方案(含 Java 代码示例) 在软件开发中,我们经常需要创建对象,而有些对象的创建成本较高或者结构较为复杂。如何在不破坏封装的前提下,高效地创建对象? 这正是**原…...
JetsonOrin源码安装部署PaddlePaddle
Jetson Orin 源码安装部署Paddle 部署环境 系统架构: Arm CUDA: 11.4 cmake: 3.18.0 python:3.8 注意环境中的版本问题,之前装onnxruntime的时候cmake被升级到了3.31.0,但是编译Paddle时会报错,因此特意降级回了官方推荐的3.18.0 具体环…...
入门到入土,Java学习 day20(多线程下)
void wait() 当前线程等待,直到被其他线程唤醒 void notify() 随机唤醒单个线程 void notifyAll() 唤醒所有线程 阻塞队列 在测试方法中创建带锁队列,然后在对象类中也创建队列但是不赋值,用构造方法将测试方法中的对象赋值 然后用put和t…...
【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
栈(LIFO)算法题
1.删除字符串中所有相邻的重复字符 注意,我们需要重复处理,而不是处理一次相邻的相同元素就结束了。对示例来说,如果只进行一次处理,结果为aaca,但是处理之后又出现了相邻的重复元素,我们还得继续处理&…...
印章/公章识别:PaddleX下的“Seal-Recognition”模型
最近做项目需要对印章进行识别,并提取其中的印章文字,又不希望这个模型太大,还要方便部署,于是乎这个模型是个不错的选择。 一、模型简介 “Seal-Recognition”模型是PaddleX旗下的一款模型(PaddleX 是基于飞桨框架构…...
从LLM出发:由浅入深探索AI开发的全流程与简单实践(全文3w字)
文章目录 第一部分:AI开发的背景与历史1.1 人工智能的起源与发展1.2 神经网络与深度学习的崛起1.3 Transformer架构与LLM的兴起1.4 当前AI开发的现状与趋势 第二部分:AI开发的核心技术2.1 机器学习:AI的基础2.1.1 机器学习的类型2.1.2 机器学…...
DeepSeek入门宝典——行业应用篇
大家好,我是吾鳴。 今天吾鳴要给大家分享一份由51CTO智能研究院出品的DeepSeek报告——《DeepSeek入门宝典——行业应用篇》。这份报告主要从DeepSeek核心能力、行业赋能与应用案例、合作伙伴与生态建设和学习资料与体系化方案做了详细的介绍,报告一共有…...
K8S学习之基础三十一:k8s中RBAC 的核心概念
Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的访问控制)是一种用于管理用户和服务账户对集群资源访问权限的机制。RBAC 允许管理员通过定义角色(Role)和角色绑定(RoleBindingÿ…...
JAVA数据库技术(一)
JDBC 简介 JDBC(Java Database Connectivity)是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库,并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式,使…...