C++——异常
1. C语言错误处理机制
我们在曾经介绍过C语言下的错误码。错误码我们过去经常见到,错误码通常是指errno变量中的值,它表示特定操作(如系统调用或库函数)发生错误的原因。errno是一个全局变量,当出现错误时会自动将错误码存储在errno中,不同的值代表着不同的错误信息。我们可以通过perror和strerror来查看错误信息。
perror:void perror(const char *s); 打印输入的参数字符串+此时errno对应的错误信息
strerror:char *strerror(int errnum); 打印指定错误码(传入参数)的错误信息
对于退出码,它是在进程结束后返回的一个退出状态信息,表示程序的执行结果,一般约定0为成功,而非0为出现错误,至于退出码和原因的对应关系没有固定的要求。
除了错误码之外,C语言下的终止程序也是一种处理方案,比如assert断言、内存错误等,只不过这种处理方式十分粗暴。
C++采取异常的方式处理错误,当一个函数发现错误后,可以选择抛出一个异常,这个异常就会顺着调用链传递,找到能够处理这个异常的模块。
2. 异常的使用方法
为了使用C++的异常,引入三个关键字:
throw:它的作用是抛出异常。
try:在try语句块中的代码会被“监视”,判断其中的代码在执行中是否发生了异常。如果没有异常发生,那么相安无事。一旦发生了异常,则会停止块中的代码执行,转而搜索catch块,寻找匹配的catch来处理异常。
catch:用于捕获和指定的对象类型相同的异常。
double Div(int a, int b)
{int ret = 0;//throw 可以抛出一个异常,这个异常实际上是一个对象//后续会根据这个对象的类型决定匹配的catchif (b == 0) throw "Devision by zero"; //抛出一个const chat*类型的异常//首先检查throw是否在try块的内部// 在try中:查找接收的类型和异常对象类型匹配catch// 不在try中或在try中却没有匹配的catch:直接结束当前函数,返回上一层函数中继续判断是否位于try中并进行catch匹配else ret = double(a) / double(b);cout << "div return" << endl;return ret;
}
void fun()
{int a, b;cin >> a >> b;cout << Div(a, b) << endl;cout << "fun return" << endl;
}//输入1 0:
// Div函数中:if分支为真,抛出一个const char*的异常。由于throw不在try块内,所以直接结束当前函数,返回到fun函数中捕获异常
// fun函数中:抛出异常导致退出Div栈帧后返回fun函数的调用Div函数处,同样不在try内,直接结束当前函数,返回到main函数中捕获异常
// main函数中:对于fun的调用在try中,因此进行catch匹配,并且成功匹配到了const char*类型,进入处理异常,异常处理结束后继续main函数的执行
int main()
{try{fun();}catch (const int num) //匹配int型异常对象{cout << num << endl;}catch (const char* message) //匹配const char*型异常对象{cout << message << endl;}//catch匹配成功则进入处理异常,并且在处理完异常后继续后续代码执行//main函数仍未成功匹配,则终止程序catch (...)//可以捕获任意类型的异常{cout << "unknown exception" << endl;}cout << "main return" << endl;//和函数的返回值一样,异常对象作为函数的局部对象想要被调用链其他函数捕获,就需要对其拷贝构造来传递//当然在C++11中,这一步拷贝构造传递完全可以由移动构造来完成return 0;
}
在这个例子中,如果输入1 0:
Div函数中:if分支为真,抛出一个const char*的异常。由于throw不在try块内,所以直接结束当前函数,返回到fun函数中捕获异常;
fun函数中:抛出异常导致退出Div栈帧后返回fun函数的调用Div函数处,同样不在try内,直接结束当前函数,返回到main函数中捕获异常;
main函数中:对于fun的调用在try中,因此进行catch匹配,并且成功匹配到了const char*类型,进入处理异常,异常处理结束后继续main函数的执行。
使用要点:
①throw用于可以抛出一个异常,这个异常实际上是一个具体的对象(如int类型对象、string类型对象等),后续的catch会根据这个对象的类型决定匹配的catch。
②抛出的异常如果在当前函数无法处理(包括没有位于try块中,或没有匹配的catch),那么异常对象会沿着函数的调用链向上传递。即直接结束当前函数,将异常带到调用这个函数的地方去找处理方案。
具体来说,throw抛出异常后如果在try中,则在后续的catch中查找接收的类型和异常对象类型匹配catch,如果找到了匹配的catch,则根据catch块的代码处理异常。
如果throw抛出时不在try中,或在try中却没有匹配的catch,那么则直接结束当前函数,返回上一层函数中继续判断是否位于try中并进行catch匹配。
③异常匹配catch会选择类型严格匹配且距离最近的,即异常对象的匹配不支持隐式类型转换,并且如果函数a调用函数b,函数b调用函数c,c抛出的异常在b和a中都可以被捕捉,但是会优先被b捕捉处理,所以不再会去a中试图catch。
④如果catch匹配成功则进入处理异常,并且在处理完异常后继续本函数后续代码执行。后续代码即为try-catch语句块之后的代码。
⑤如果直到main函数,异常仍未成功匹配,则终止程序并报错。
⑥catch (...)可以捕获任意类型的异常。
⑦和函数的返回值一样,异常对象也需要在函数之间传递。异常对象时函数的局部对象,如果想要被调用链其他函数捕获,就需要对其拷贝构造来传递,这和函数返回值一模一样。当然在C++11中,这一步拷贝构造传递完全可以由移动构造来完成。
⑧虽然异常对象的catch捕捉不支持隐式类型转换,但是对继承关系的基类和派生类之间的对象是存在例外的。允许抛出的派生类对象,而使用基类捕获。
以下给出一个基类捕获派生类异常的例子,实际上这也是异常体系的基本定义方式。
class Exception
{
public:Exception(const string& errormessage, int id):_ErrorMessage(errormessage), _id(id){}virtual string show() const //虚函数用于实现多态{return _ErrorMessage;}protected:string _ErrorMessage; //错误信息描述int _id; //错误id
};class SqlException :public Exception
{
public:SqlException(const string& errormessage, int id, const string& sql):Exception(errormessage,id) //构造基类部分,_sql(sql){}virtual string show() const //重写{string ret = "SqlException:";ret += _ErrorMessage;ret += "->";ret += _sql;return ret;}
private:const string _sql;
};class HttpException :public Exception
{
public:HttpException(const string& errormessage, int id, const string& http):Exception(errormessage,id) //构造基类部分,_http(http){}virtual string show() const //重写{string ret = "HttpException:";ret += _ErrorMessage;ret += "->";ret += _http;return ret;}
private:const string _http;
};class CacheException :public Exception
{
public:CacheException(const string& errormessage, int id):Exception(errormessage,id) //构造基类部分{}virtual string show() const //重写{string ret = "CacheException:";ret += _ErrorMessage;return ret;}
};void SqlServe()
{srand(time(0));if (rand() % 11 == 0){throw SqlException("权限不足", 101, "select * from student where name=\'张三\'");}cout << "success" << endl;
}
void CacheServe()
{srand(time(0));if (rand() % 7 == 0){throw CacheException("权限不足", 111);}if (rand() % 5 == 0){throw CacheException("数据缺失", 112);}SqlServe();
}
void HttpServe()
{srand(time(0));if (rand() % 4 == 0){throw HttpException("权限不足", 131, "get");}if (rand() % 3 == 0){throw HttpException("资源缺失", 132, "post");}CacheServe();
}int main()
{while (1){this_thread::sleep_for(chrono::seconds(1));try{HttpServe();}catch (const Exception& ex) //只捕获父类{cout << ex.show() << endl; //多态}catch (...){cout << "unknown exception" << endl;}}return 0;
}
3. 异常的注意事项
3.1 异常重新抛出
异常支持重新抛出,即有可能单个的catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用链函数来处理,catch则可以通过重新抛出将异常传递给更上层的函数进行处理。
异常在接收后重新抛出对于有资源申请的函数模块有很大意义。在某些情况下,并不需要在本函数处理异常,但是由于本函数申请了资源,出现异常直接结束函数会导致资源泄露。所以出现异常就需要捕获,成功捕获后释放资源,再将异常重新抛出。
double Div(int a, int b)
{int ret = 0;if (b == 0) throw "Devision by zero"; else ret = double(a) / double(b);return ret;
}
void fun()
{int* array = new int[10];try {int a, b;cin >> a>> b;cout << Div(a, b) << endl;}catch (const int num){throw num;//重新抛出num异常对象}catch (...){//某些情况并不需要在本函数处理异常,但是出现异常直接结束函数会导致资源泄露//所以出现异常就需要捕获,成功捕获后释放资源,再将异常重新抛出cout << "delete []" << array << endl;delete[] array;throw; //异常的重新抛出,接收什么抛出什么}cout << "delete []" << array << endl;delete[] array;
}
int main()
{try{fun();}catch (const char* message){cout << message << endl;}catch (...){cout << "unknown exception" << endl;}return 0;
}
3.2 new异常的处理
考虑以下修改后的fun函数代码。
void fun()
{int* array1 = new int[10];int* array2 = new int[10];try {int a, b;cin >> a>> b;cout << Div(a, b) << endl;}catch (...){delete[] array1;delete[] array2;throw;}delete[] array1;delete[] array2;
}
new也是会抛异常的,当array1申请资源失败后,需要直接抛异常;当array2申请资源失败后则需要先释放array1的资源,然后再抛异常。会发现仅仅对于两个连续的new,如果我们完善的考虑异常的问题,需要不小的try-catch语句块。
void fun()
{int* array1 = nullptr;int* array2 = nullptr;try {array1 = new int[10];try {array2 = new int[10];} catch (...) {// 如果array2分配失败,清理array1delete[] array1;throw;}}catch (...) {// array1分配失败throw;}try {int a, b;cin >> a>> b;cout << Div(a, b) << endl;}catch (...){delete[] array1;delete[] array2;throw;}delete[] array1;delete[] array2;}
对于这种问题,最好的解决方案是C++11引入的智能指针。智能指针实际上就是为指针包装了一个类的壳子,这样指针就变为了一个局部对象,那么在函数栈帧销毁时自动调用析构函数,从而完成资源的自动释放。
template <class T>
class SmartPtr
{
public:SmartPtr(T* ptr):_ptr(ptr){}~SmartPtr(){delete(_ptr);}T& operator*(){return *_ptr;}T* operator*(){return _ptr;}
private:T* _ptr;
};/
//fun()函数内:A* a1 = new A;A* a2 = new A;//①C++库的智能指针unique_ptr<A> a1 = new A;unique_ptr<A> a2 = new A;//②自己包装的简单的智能指针SmartPtr<A> p1=(new A);SmartPtr<A> p2=(new A);
3.3 异常的其他要点
①构造函数、析构函数完成的是对象的初始化和资源清理过程,所以尽量避免在构造函数和析构函数中抛异常,防止对象未完全初始化和资源泄露的问题。
②在C++98中,规定了异常的规格说明:
如果函数内会出现异常,则需要在函数后使用throw(异常类型)来列出所有可能的异常类型。
如果函数内不会出现异常,则使用throw()。
但是这套异常规格说明自C++11起被noexcept取代,C++17 移除动态异常规范(只保留 throw() 作为 noexcept 的旧式写法)。
所以在C++11下如果函数不会抛异常,则使用noexcept即可。如果不说明则表示可能会抛异常。
③异常可以方便我们更加清晰地展示错误信息,更加准确的定位错误位置,更加方便的完成错误处理。但是其也使得代码执行顺序大幅度跳转,并且非常容易引起内存泄漏和死锁等问题,需要我们多加注意。
fun1() noexcept;//表示不会抛异常
fun2();//表示可能会抛异常
4. C++标准库的异常体系
相关文章:
C++——异常
1. C语言错误处理机制 我们在曾经介绍过C语言下的错误码。错误码我们过去经常见到,错误码通常是指errno变量中的值,它表示特定操作(如系统调用或库函数)发生错误的原因。errno是一个全局变量,当出现错误时会自动将错误…...
vue3 中 iframe 多页面切换导致资源刷新的问题解决
最近发现一个问题,我在使用 websocket 的时候,在主页面进行了 websocket 连接了之后,再使用 iframe 打开子页面的时候,通常会触发页面刷新,这样就导致 WebSocket 断开,这是因为切换 src 会重新加载 iframe …...
php多种方法实现xss过滤
1. 使用 htmlspecialchars() 函数 htmlspecialchars() 是一个PHP内置函数,用于将特殊字符转换为HTML实体,从而防止浏览器将其解释为HTML或脚本代码。 <?phpfunction sanitizeInput($input) {// 将特殊字符转换为HTML实体return htmlspecialchars($…...
蓝桥杯练习题2
动态规划 动态规划三大题型:计数问题、最值问题、存在性问题; 【最小权值】-- 最值问题 【题目分析】 import java.util.Arrays; Arrays类中的一个方法:Arrays.fill(int[] m,int n) //给 int 类型(或者char类型/Long类型...)的数组全部空间…...
Python遥感开发之Hurst指数的实现
Python遥感开发之Hurst指数的实现 主要讲解Python实现Hurst指数,实现遥感下的Hurst指数,对Hurst指数进行分类,以及结合slope指数实现对未来变化趋势的分析。 文章目录 Python遥感开发之Hurst指数的实现0 什么是Hurst指数1 Python实现Hurst指…...
opencv 给图片和视频添加水印
给图片和视频添加水印 1 给图片添加水印2 给视频添加水印 1 给图片添加水印 代码如下: 添加水印 imgcv2.imread(r../15day4.10/src/xiaoren.png) img2cv2.imread(r../15day4.10/src/bg.png) h,w,cimg.shapeRIO_img2img2[100:100h,200:200w]img3cv2.cvtColor(img,…...
国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)
文章目录 一、B接口协议图像数据上报通知接口介绍B.13.1 接口描述B.13.2 接口流程B.13.3 接口参数B.13.3.1 SIP头字段B.13.3.2 SIP响应码B.13.3.3 XML Schema参数定义 B.13.4 消息示例B.13.4.1 图像数据上报请求B.13.4.2 图像数据上报响应 二、B接口图像数据上报通知失败常见问…...
Redis(持久化)
目录 一 Redis持久化的方式 1. RDB(Redis Database) 2. AOF(Append Only File) 二 对比RDB/AOF 为什么要持久化 Redis是跑在内存上的,但内存上的数据是临时的,Redis服务挂了,数据也就丢失了,所以为了解决上述问题,R…...
Linux系统中的网络管理
1.RHEL9版本中,使用nm进行网络配置,ifcfg不再是网络配置文件的主存储,样式仍然可用,但它不再是NetworkManger存储新网络配置文件的默认位置,RHEL以key-file格式在etc/NetworkManger/system-connections/中存储新的网络…...
【深度学习—李宏毅教程笔记】Transformer
目录 一、序列到序列(Seq2Seq)模型 1、Seq2Seq基本原理 2、Seq2Seq模型的应用 3、Seq2Seq模型还能做什么? 二、Encoder 三、Decoder 1、Decoder 的输入与输出 2、Decoder 的结构 3、Non-autoregressive Decoder 四、Encoder 和 De…...
关于UE5的抗锯齿和TAA
关于闪烁和不稳定现象的详细解释 当您关闭抗锯齿技术时,场景中会出现严重的闪烁和不稳定现象,尤其在有细节纹理和小物体的场景中。这种现象的技术原因如下: 像素采样问题 在3D渲染中,每个像素只能表示一个颜色值,但…...
交换网络基础
学习目标 掌握交换机的基本工作原理 掌握交换机的基本配置 交换机的基本工作原理 交换机是局域网(LAN)中实现数据高效转发的核心设备,工作在 数据链路层(OSI 模型第二层),其基本工作原理可概括为 “学习…...
AUTOSAR图解==>AUTOSAR_SWS_EFXLibrary
AUTOSAR 扩展定点数学函数库(EFX)分析 1. 概述 AUTOSAR (AUTomotive Open System ARchitecture) 是汽车电子控制单元(ECU)软件架构的开放标准。在AUTOSAR架构中,扩展定点数学函数库(Extended Fixed-point library, EFX)提供了一组优化的定点数学运算函数ÿ…...
六边形棋盘格(Hexagonal Grids)的坐标
1. 二位坐标转六边形棋盘的方式 1-1这是“波动式”的 这种就是把【方格子坐标】“左右各错开半个格子”做到的 具体来说有如下几种情况 具体到庙算平台上,是很巧妙的用一个4位整数,前两位为x、后两位为y来进行表示 附上计算距离的代码 def get_hex_di…...
李宏毅NLP-5-RNNTNeural TransducerMoChA
RNN Transducer(RNN-T) 循环神经对齐器(RNA,Recurrent Neural Aligner)对CTC解码器的改进,具体内容如下: “RNA”,全称 “Recurrent Neural Aligner”,引用来自 [Sak, et al., INTERSPEECH’17…...
GPT-SoVITS 使用指南
一、简介 TTS(Text-to-Speech,文本转语音):是一种将文字转换为自然语音的技术,通过算法生成人类可听的语音输出,广泛应用于语音助手、无障碍服务、导航系统等场景。类似的还有SVC(歌声转换&…...
洛谷的几道题
P1000 超级玛丽游戏 # P1000 超级玛丽游戏 ## 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 [P1001](/problem/P1001)、[P1008](/problem/P1008)。 另外强烈推荐[新用户必读帖](/discuss/show/241461)。 ## 题目描述 …...
利用yakit充实渗透字典
前言 在渗透侧测试结束,在我们的历史记录中会保存过程中的数据包。在其中有些特征,比如API、参数,可以活用于下次的渗透。 比如 fuzz变量,fuzz隐藏API…… 但是我们一个一个提取很麻烦,可以使用yakit的插件…...
精益数据分析(4/126):开启数据驱动的创业之旅
精益数据分析(4/126):开启数据驱动的创业之旅 在创业的浪潮中,我们都怀揣着梦想,渴望找到那条通往成功的道路。作为一名在创业和数据分析领域摸爬滚打多年的“老兵”,我深知其中的艰辛与挑战。今天&#x…...
机器学习误差图绘
机器学习误差图绘制 绘图类 # Define the ModelComparisonPlot class class ModelComparisonPlot:def __init__(self, model_name):self.model_name model_namedef plot_comparison(self, y_val, y_pred, mse, mae, r2):# Create a figure with two subplotsfig, axes plt.…...
企业级RAG选择难题:数据方案的关键博弈
企业级RAG选择难题:数据方案的关键博弈 向量数据库:高效但易失语境图数据库与知识图谱:关系网络的力量企业级RAG数据方案的最佳实践 智能时代,企业数据每日剧增。员工寻找答案的效率直接影响工作流程,StackOverflow调查…...
JNI 学习
1. JNI 不属于 C,而是 JDK 的 日志失效,可以 adb kill-server adb kill-serveradb start-server 使用 jni final和 private变量都能修改...
PyTorch :优化的张量库
PyTorch 是一个基于 Python 的开源机器学习框架,由 Facebook 的 AI 研究团队(现 Meta AI)于 2016 年推出。它专为深度学习设计,但也可用于传统的机器学习任务。PyTorch 的核心优势在于灵活性、动态计算图和易…...
DevOps 进阶指南:如何让工作流更丝滑?
DevOps 进阶指南:如何让工作流更丝滑? 引言 在 DevOps 世界里,我们追求的是高效、稳定、自动化。但现实总是充满挑战:代码部署失败、CI/CD 过程卡顿、环境不一致……这些痛点让开发和运维团队疲惫不堪。今天,我就来聊聊如何优化 DevOps 工作流,通过实战案例和代码示例,…...
BT-Basic函数之首字母XY
BT-Basic函数之首字母XY 文章目录 BT-Basic函数之首字母XYXxd__ commands Yyes X xd__ commands 当使用外部设备时,开发人员需要在测试计划中添加适当的命令来控制这些设备。下表显示了一个典型的命令序列。 典型的命令序列 NO命令描述1xdload将DLL加载到内存中…...
6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写
1)在功能包下新建msg目录,在msg目录下新建Person.msg,在Person.msg文件写入: string name uint16 age float64 height 2)修改配置文件 2.1) 功能包下package.xml文件修改 <build_depend>message_generation</build_depend><exec_depend…...
Fastdata极数:全球AR/VR行业发展趋势报告2025
科技的快速发展孕育了一个新的数字前沿领域,那就是虚拟宇宙,也就是我们谈论的元宇宙(Metaverse),虚拟宇宙最初构思于尼尔斯蒂芬森的科幻小说《雪崩》中,小说中虚拟宇宙由虚拟人物居住,并以数字方…...
背包 DP 详解
文章目录 背包DP01 背包完全背包多重背包二进制优化单调队列优化 小结 背包DP 背包 DP,说白了就是往一个背包里扔东西,求最后的最大价值是多少,一般分为了三种:01 背包、完全背包和多重背包。而 01 背包则是一切的基础。 01 背包…...
深入剖析 HashMap:内部结构与性能优化
深入剖析 HashMap:内部结构与性能优化 引言 HashMap 是 Java 集合框架中的核心类,广泛应用于数据存储和检索场景。本文将深入剖析其内部结构,包括数组、链表和红黑树的转换机制,帮助读者理解其工作原理和性能优化策略。 1. Hash…...
数据从辅存调入主存,页表中一定存在
在虚拟内存系统中,数据从辅存调入主存时,页表中一定存在对应的页表项,但页表项的「存在状态」会发生变化。以下是详细分析: 关键逻辑 页表的作用 页表是虚拟内存的核心数据结构,记录了虚拟地址到物理地址的映射关系…...
藏品馆管理系统
藏品馆管理系统 项目简介 这是一个基于 PHP 开发的藏品馆管理系统,实现了藏品管理、用户管理等功能。 藏品馆管理系统 系统架构 开发语言:PHP数据库:MySQL前端框架:BootstrapJavaScript 库:jQuery 目录结构 book/…...
力扣算法ing(60 / 100)
4.19 回溯合集—93复原ip地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...
时态--06--现在完成時
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 现在完成時1.语法1.肯定句2.否定句3.疑问句4.have been/gone to5.现在分词 practice 现在完成時 1.语法 1.肯定句 2.否定句 3.疑问句 4.have been/gone to 5.现在分…...
Java中常见的锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock
在Java中,锁是实现多线程同步的核心机制。不同的锁适用于不同的场景,理解其实现原理和使用方法对优化性能和避免并发问题至关重要。 一、隐式锁:synchronized 关键字 实现原理 基于对象监视器(Monitor):每…...
【教程】DVWA靶场渗透
【教程】DVWA靶场渗透 备注一、环境搭建二、弱口令(Brute Force)三、命令注入(Command Injection)四、CSRF(Cross Site Request Forgery)五、文件包含(File Inclusion)六、文件上传&…...
23种设计模式-创建型模式之原型模式(Java版本)
Java 原型模式(Prototype Pattern)详解 🧬 什么是原型模式? 原型模式用于通过复制已有对象的方式创建新对象,而不是通过 new 关键字重新创建。 核心是:通过克隆(clone)已有对象&a…...
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读前言autopad函数Conv类__init__成员函数forward成员函数forward_fuse成员函数 Bottleneck类__init__成员…...
PDF转excel+json ,vue3+SpringBoot在线演示+附带源码
在线演示地址:Vite Vuehttp://www.xpclm.online/pdf-h5 源码gitee前后端地址: javapdfexcel: javaPDF转excelhttps://gitee.com/gaiya001/javapdfexcel.git 盖亚/vuepdfhttps://gitee.com/gaiya001/vuepdf.git 后续会推出 前端版本跟nestjs版本 识别复…...
LeetCode 热题 100_乘积最大子数组(88_152_中等_C++)(动态规划)
LeetCode 热题 100_乘积最大子数组(88_152) 题目描述:输入输出样例:题解:解题思路:思路一(暴力破解法(双重循环)):思路二(动态规划): …...
Nvidia显卡架构演进
1 简介 显示卡(英语:Display Card)简称显卡,也称图形卡(Graphics Card),是个人电脑上以图形处理器(GPU)为核心的扩展卡,用途是提供中央处理器以外的微处理器帮…...
TCP/IP、UDP、HTTP、HTTPS、WebSocket 一文讲解
在当今互联网世界中,数据通信是所有应用运行的基础。无论是打开网页、发送消息还是视频通话,背后都依赖于各种网络协议的协同工作。其中,TCP/IP、UDP、HTTP、HTTPS 和 WebSocket 是最为核心的几种协议。本文将围绕它们的概念、特性和适用场景…...
[密码学基础]密码学发展简史:从古典艺术到量子安全的演进
密码学发展简史:从古典艺术到量子安全的演进 密码学作为信息安全的基石,其发展贯穿人类文明史,从最初的文字游戏到量子时代的数学博弈,每一次变革都深刻影响着政治、军事、科技乃至日常生活。本文将以技术演进为主线,…...
包含物体obj与相机camera的 代数几何代码解释
反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…...
【C++算法】65.栈_删除字符中的所有相邻重复项
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1047. 删除字符串中的所有相邻重复项 题目描述: 解法 利用string模拟栈 元素依次进栈,当进栈元素和栈顶元素一样的时候,就弹出栈顶字符…...
【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是插入排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、插入排序基础实现 原理 将元素逐个插入到已排序序列的合适位置,逐步构建有序序列。 代码示例 public class InsertionSort {void…...
神经网络的数学之旅:从输入到反向传播
目录 神经网络简介神经元激活函数神经网络 神经网络的工作过程前向传播(forward)反向传播(backward)训练神经网络 神经网络简介 神经元 在深度学习中,必须要说的就是神经⽹络,或者说是⼈⼯神经⽹络&#…...
软件测试的页面交互标准:怎样有效提高易用性
当用户遇到"反人类"设计时 "这个按钮怎么点不了?"、"错误提示完全看不懂"、"我输入的内容去哪了?"——这些用户抱怨背后,都指向同一个问题:页面交互的易用性缺陷。作为软件测试工程师&a…...
Linux419 三次握手四次挥手抓包 wireshark
还是Notfound 没连接 可能我在/home 准备配置静态IP vim ctrlr 撤销 u撤销 配置成功 准备关闭防火墙 准备配置 YUM源 df -h 未看到sr0文件 准备排查 准备挂载 还是没连接 计划重启 有了 不重启了 挂载准备 修改配置文件准备 准备清理缓存 ok 重新修改配…...
玩转Docker | 使用Docker部署tududi任务管理工具
玩转Docker | 使用Docker部署tududi任务管理工具 前言一、tududi介绍Tududi简介核心功能特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署tududi服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问tududi服务访问tududi首页登录tu…...
ueditorplus编辑器已增加AI智能
之前功能请参考:https://www.geh3408.top/blog/76 下载:https://gitee.com/mo3408/ueditorplus 注意:key值需要单独获取,默认为DeepSeek,默认key有限制,请更换为自己的。 演示地址:https://www.geh3408.top/ueditorplus/dist 更多体验:ueditorplus编辑器已增加AI智…...