当前位置: 首页 > news >正文

C++进阶——异常

目录

1、异常的概念及使用

1.1 异常的概念

1.2 异常的抛出和捕获

1.3 栈展开

1.4 查找匹配的处理代码

1.5 异常的重新抛出

1.6 异常的安全问题

1.7 异常的规范

2、标准库的异常(了解)


1、异常的概念及使用

1.1 异常的概念

C语言,出错了,就报错误码,还要去查询错误信息,比较麻烦。错误处理与正常逻辑混杂,容易遗漏检查。

C++,出错了,就(throw)抛出一个异常对象,包含更全面的错误信息,并且(try)检测错误和(catch)处理错误,分开进行

1.2 异常的抛出和捕获

当程序出现问题时,可以通过抛出(throw一个异常对象来触发异常处理机制。该对象的类型及当前的调用链共同决定了哪个catch处理此异常

异常处理流程

  1. 匹配规则
    被选中的处理代码是调用链中与该异常对象类型匹配(通过类型匹配规则),且距离抛出位置最近catch

  2. 信息传递
    通过异常对象成员变量返回what()的字符串传递错误信息

  3. 控制流转移

    • throw执行时其后的语句不再执行

    • 程序throw跳转匹配的catch,该catch可能在当前函数或调用链上游的某个函数中。

    • 控制权转移意味着:

      • 调用链中的函数可能提前退出(函数栈帧提前销毁)(栈展开,Stack Unwinding)。

      • 栈上已构造的局部对象会按创建顺序的逆序销毁(RAII保证)。

  4. 异常对象生命周期

    • 因为异常对象是局部的(类似函数值返回的临时对象),会调用移动构造,(若没有移动构造,就调用拷贝构造)。

    • 移动(或复制)对象在匹配的catch块结束时 销毁

1.3 栈展开

抛出异常后,程序暂停当前函数的执行

如果 throw try 块内部查找匹配的 catch 语句如果匹配的,则跳到 catch 的地方进行处理

如果当前函数没有 try/catch 子句,或者有 catch 子句但是类型不匹配,则退出当前函数,继续在外层调用函数链中查找,上述查找的 catch 过程被称为栈展开

如果到达 main 函数,依旧没有找到匹配的 catch 子句,程序会调用标准库的 terminate 函数终止程序

如果找到匹配的 catch 子句处理后当前 catch 子句后面的代码继续执行

1.4 查找匹配的处理代码

一般情况下,抛出对象catch类型匹配的,如果有多个类型匹配的,就选择最近的catch

允许一些例外类型转换:

非常量 -> 常量(即权限缩小),

数组->数组元素的指针

函数->函数指针

派生类->基类,这个非常实用

如果到main函数异常仍旧没有被匹配就会终止程序我们是不期望程序终止,所以一般main函数中最后都会使用catch(...),它可以捕获任意类型的异常但是不知道异常错误是什么

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <ctime>
#include <cstdlib>// 一般大型项目程序才会使用异常,下面我们模拟设计一个服务的几个模块
// 每个模块的异常都是 Exception 的派生类,每个模块可以添加自己的数据
// 最后捕获时,我们捕获基类就可以class Exception {
public:Exception(const std::string& errmsg, int id): _errmsg(errmsg), _id(id) {}virtual std::string what() const {return _errmsg;}int getid() const {return _id;}protected:std::string _errmsg;int _id;
};class SqlException : public Exception {
public:SqlException(const std::string& errmsg, int id, const std::string& sql): Exception(errmsg, id), _sql(sql) {}std::string what() const override {std::string str = "SqlException:";str += _errmsg;str += "->";str += _sql;return str;}private:const std::string _sql;
};class CacheException : public Exception {
public:CacheException(const std::string& errmsg, int id): Exception(errmsg, id) {}std::string what() const override {std::string str = "CacheException:";str += _errmsg;return str;}
};class HttpException : public Exception {
public:HttpException(const std::string& errmsg, int id, const std::string& type): Exception(errmsg, id), _type(type) {}std::string what() const override {std::string str = "HttpException:";str += _type;str += ":";str += _errmsg;return str;}private:const std::string _type;
};void SQLMgr() {if (rand() % 7 == 0) {throw SqlException("权限不足", 100, "select * from name = '张三'");} else {std::cout << "SQLMgr 调用成功" << std::endl;}
}void CacheMgr() {if (rand() % 5 == 0) {throw CacheException("权限不足", 100);} else if (rand() % 6 == 0) {throw CacheException("数据不存在", 101);} else {std::cout << "CacheMgr 调用成功" << std::endl;}SQLMgr();
}void HttpServer() {if (rand() % 3 == 0) {throw HttpException("请求资源不存在", 100, "get");} else if (rand() % 4 == 0) {throw HttpException("权限不足", 101, "post");} else {std::cout << "HttpServer 调用成功" << std::endl;}CacheMgr();
}int main() {srand(time(0));while (1) {std::this_thread::sleep_for(std::chrono::seconds(1));try {HttpServer();}catch (const Exception& e) {  // 这里捕获基类,基类对象和派生类对象都可以被捕获std::cout << e.what() << std::endl;}catch (...) {std::cout << "Unkown Exception" << std::endl;}}return 0;
}

1.5 异常的重新抛出

有时catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理其他错误则重新(throw)抛出异常外层调用链处理。捕获异常后需要重新抛出,直接 throw; 就可以把捕获的对象直接抛出。

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>using namespace std;// 下面程序模拟展示了聊天时发送消息,发送失败捕获异常
// 可能在电梯地下室等场景手机信号不好,需要多次尝试
// 如果多次尝试都发送不出去,则需要捕获异常再重新抛出
// 如果不是网络差导致的错误,捕获后也要重新抛出class Exception {
public:Exception(const string& errmsg, int id): _errmsg(errmsg), _id(id) {}virtual string what() const {return _errmsg;}int getid() const {return _id;}protected:string _errmsg;int _id;
};class HttpException : public Exception {
public:HttpException(const string& errmsg, int id, const string& type): Exception(errmsg, id), _type(type) {}string what() const override {string str = "HttpException:";str += _type;str += ":";str += _errmsg;return str;}private:const string _type;
};void _SendMsg(const string& s) {if (rand() % 2 == 0) {throw HttpException("网络不稳定,发送失败", 102, "put");}else if (rand() % 7 == 0) {throw HttpException("你已经不是对方的好友,发送失败", 103, "put");}else {cout << "发送成功" << endl;}
}void SendMsg(const string& s) {// 发送消息失败,则再重试3次for (size_t i = 0; i < 4; i++) {try {_SendMsg(s);break;}catch (const Exception& e) {// 捕获异常,如果是102号错误(网络不稳定),则重新发送// 如果不是102号错误,则将异常重新抛出if (e.getid() == 102) {// 重试三次以后还是失败,则说明网络太差,重新抛出异常if (i == 3) {throw;}cout << "开始第" << i + 1 << "次重试" << endl;}else {throw;}}}
}int main() {srand(time(0));string str;while (cin >> str) {try {SendMsg(str);}catch (const Exception& e) {cout << e.what() << endl << endl;}catch (...) {cout << "Unknown Exception" << endl;}}return 0;
}

如果是102号错误,这个异常不处理,出了catch子句,自动析构,再尝试发送。

1.6 异常的安全问题

异常抛出后后面的代码就不再执行,前面申请了资源(内存、锁等),后面进行释放,但是中间可能会抛异常就会导致资源没有释放,这里由于异常就引发了资源泄漏,产生安全性的问题。解决方案:

1. 可以中间捕获异常释放资源后再重新抛出麻烦

2. 后面的智能指针章节讲的RAII方式解决这种问题更方便

其次析构函数中,如果抛出异常也要谨慎处理,比如析构函数要释放10个资源,释放到第5个时抛出异常,则也需要捕获处理,否则后面的5个资源就没释放,也资源泄漏了。《Effective C++》第8个条款也专门讲了这个问题,别让异常逃离析构函数。

1.7 异常的规范

对于用户和编译器而言,预先知道某个程序会不会抛出异常大有裨益,有助于简化代码

C++98中函数参数列表的后面接throw(),表示函数不抛异常,函数参数列表的后面接throw(类型1, 类型2...)表示可能会抛出多种类型的异常,可能会抛出的类型用逗号分割。

C++98的方式这种方式过于复杂,实践中并不好用,C++11中进行了简化函数参数列表后面noexcept表示不会抛出异常

编译器不会在编译时检查noexcept,也就是说如果一个函数noexcept修饰了,但是同时又包含了throw语句或者调用的函数可能会抛出异常编译还是会顺利通过的(有些编译器可能会报个警告)。但是一个声明了noexcept的函数 抛出了异常,程序会调用terminate终止程序

noexcept(expression)还可以作为一个运算符去检测一个表达式 是否会抛出异常可能会则返回false不会就返回true

一般外层处理异常

#include <iostream>
using namespace std;double Divide(int a, int b) // noexcept
{// 当 b == 0 时抛出异常if (b == 0){throw "Division by zero condition!";}return (double)a / (double)b;
}int main()
{try{int len, time;cin >> len >> time;cout << Divide(len, time) << endl;}catch (const char* errmsg){cout << errmsg << endl;}catch (...){cout << "Unknown Exception" << endl;}int i = 0;cout << noexcept(Divide(1, 2)) << endl; // 0cout << noexcept(Divide(1, 0)) << endl; // 0cout << noexcept(++i) << endl; // 1return 0;
}

2、标准库的异常(了解)

exception - C++ Reference

不好用,公司一般自己实现异常库。

相关文章:

C++进阶——异常

目录 1、异常的概念及使用 1.1 异常的概念 1.2 异常的抛出和捕获 1.3 栈展开 1.4 查找匹配的处理代码 1.5 异常的重新抛出 1.6 异常的安全问题 1.7 异常的规范 2、标准库的异常(了解) 1、异常的概念及使用 1.1 异常的概念 C语言&#xff0c;出错了&#xff0c;就报错…...

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html...

C++ 编程指南36 - 使用Pimpl模式实现稳定的ABI接口

一&#xff1a;概述 C 的类布局&#xff08;尤其是私有成员变量&#xff09;直接影响它的 ABI&#xff08;应用二进制接口&#xff09;。如果你在类中添加或修改了私有成员&#xff0c;即使接口不变&#xff0c;编译器生成的二进制布局也会变&#xff0c;从而导致 ABI 不兼容。…...

笔记本电脑突然无法开机电源灯亮但是屏幕无法点亮

现象 按电源键&#xff0c;电源灯点亮&#xff0c;屏幕没动静 风扇开始运转&#xff0c;然后一会儿就不转了&#xff1b;屏幕一直没动静&#xff0c;屏幕没有任何反应&#xff08;没有系统启动画面&#xff0c;没有徽标显示&#xff0c;就一点反应也没用&#xff09; 这个问…...

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现&#xff08;4.0&#xff09;‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟&#xff08;Logical Clock&#xff09;‌ 和 ‌快照隔离&#xff08;Snapshot Isolation&#xff09;‌ 实现多文档事务&#xff0c;事务提交时通过…...

decompiled.class file bytecode version50(java 6)

idea运行项目报错&#xff0c;跳到具体的.class中&#xff0c;idea会给出提示下载源码&#xff0c;点击下载报错&#xff0c;具体报错信息我没记录了&#xff08;反正就是无法看到源码&#xff09; 解决方式&#xff1a; 1、网上说下载scala插件&#xff0c;重启idea即可 但是…...

CSS 列表样式学习笔记

CSS 列表样式提供了强大的功能&#xff0c;用于定制 HTML 列表的外观。通过 CSS&#xff0c;可以轻松地改变列表项的标记类型、位置&#xff0c;甚至使用图像作为列表项标记。以下是对 CSS 列表样式的详细学习笔记。 一、HTML 列表类型 在 HTML 中&#xff0c;主要有两种类型…...

linux网络设置

ifconfig 查看ip地址 查看当前的liunx系统的网络参数ip地址 Ubuntu需要安装 Apt install -y net-tools 查看网络信息 Ifconfig 只能看到开启的网卡 Ifconfig -a 看到所有的网卡包括开启和关闭的 Ifconfig 网卡名称 up 开启网卡 Ifconfig 网卡名称 down 关闭网卡 If…...

抗干扰CAN总线通信技术在分布式电力系统中的应用

摘要&#xff1a;随着分布式电力系统的广泛应用&#xff0c;其通信系统的可靠性与稳定性受到了前所未有的挑战。CAN总线通信技术以其卓越的抗干扰性能和可靠性&#xff0c;在众多通信技术中脱颖而出&#xff0c;成为解决分布式电力系统通信问题的关键。本文深入剖析了CAN总线通…...

Maven工具学习使用(十二)——extension和depency的区别

在 Maven 中&#xff0c;extensions 和 dependencies 是两个不同的概念&#xff0c;它们在项目构建和依赖管理中扮演着不同的角色。 1、Dependencies dependencies 是 Maven 项目中用于管理项目所需的库和模块的部分。这些依赖可以是本地仓库中的&#xff0c;也可以是远程仓库…...

Python学生信息查询

利用字典设置学生信息&#xff0c;将这些信息放入列表中进行存储&#xff0c;根据输入的姓名查询展示对应的学生信息。 Student1{no:202001,name:zyt,score:87} Student2Student1.copy() Student3Student2.copy()Student2[no]202002 Student3[no]202003Student2[name]zwh Stud…...

一天时间,我用AI(deepseek)做了一个配色网站

前言 最近在开发颜色搭配主题的相关H5和小程序&#xff0c;想到需要补充一个web网站&#xff0c;因此有了这篇文章。 一、确定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你没有100%了解自己的需求&#xff0c;可以先让AI帮你理清逻辑和思路&#xff0c;…...

MQ(消息队列)体系详解

消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09; 是一种基于消息传递的异步通信机制&#xff0c;用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者&#xff0c;提供高可用、高吞吐量和可靠的消息传递。 一、消息队列用途 1.系统解耦 …...

【GESP真题解析】第 3 集 GESP一级样题卷编程题 2:闰年求和

大家好&#xff0c;我是莫小特。 这篇文章给大家分享 GESP 一级样题卷编程题第 2 题&#xff1a;闰年求和。 题目链接 洛谷链接&#xff1a;B3846 闰年求和 一、完成输入 根据题目要求&#xff0c;我们需要输入两个整数&#xff0c;分别表示起始年份和终止年份。 要求计算…...

Windows Server 2019 安装 Docker 完整指南

博主本人使用的是离线安装 1. 安装前准备 系统要求 操作系统&#xff1a;Windows Server 2019&#xff08;或 2016/2022&#xff09;权限&#xff1a;管理员权限的 PowerShell网络&#xff1a;可访问互联网&#xff08;或离线安装包&#xff09; 启用容器功能 Install-Win…...

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具 一、介绍 JetBrains PhpStorm 2024 mac&#xff0c;是一款PHP开发工具&#xff0c;直接开始编码&#xff0c;无需安装和配置大量插件。PhpStorm 从一开始就已包含 PHP、JavaScript 和 TypeScript 开发所需的一切&#xff0c;还…...

机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。

机器学习(ML)在AI驱动测试中扮演着 核心引擎 的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。以下是机器学习在测试各环节的具体作用及实现方案: 一、机器学习在测试生命周期中的作用 #mermaid-svg-u4vgPE6O2jugiZFB {font-family:"trebuchet ms&qu…...

0x06.Redis 中常见的数据类型有哪些?

回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...

本地缓存方案Guava Cache

Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案&#xff0c;适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...

A Causal Inference Look at Unsupervised Video Anomaly Detection

标题&#xff1a;无监督视频异常检测的因果推断视角 原文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/20053 发表&#xff1a;AAAI-2022 文章目录 摘要引言相关工作无监督视频异常检测因果推断 方法问题公式化一般设置强基线模型 无监督视频异常检测的因…...

MQ(RabbitMQ.1)

MQ的含义及面试题 MQMQ的含义MQ之间的调用的方式MQ的作用MQ的几种产品RabbitMQRabbitMQ的安装RabbitMQ的使用RabbitMQ⼯作流程 AMQPWeb界面操作用户相关操作虚拟主机相关操作 RabbitMQ的代码应用编写生产者代码编写消费者代码 生产者代码消费者代码 MQ MQ的含义 MQ&#xff0…...

cursor+高德MCP:制作一份旅游攻略

高德开放平台 | 高德地图API (amap.com) 1.注册成为开发者 2.进入控制台选择应用管理----->我的应用 3.新建应用 4.点击添加Key 5.在高德开发平台找到MCP的文档 6.按照快速接入的步骤&#xff0c;进行操作 一定要按照最新版的cursor, 如果之前已经安装旧的版本卸载掉重新安…...

FPGA时序分析与约束(11)——时钟组

目录 一、同步时钟与异步时钟 二、逻辑与物理独立时钟 2.1 逻辑独立时钟 2.2 物理独立时钟 三、如何设置时钟组 四、注意事项 专栏目录&#xff1a; FPGA时序分析与约束&#xff08;0&#xff09;——目录与传送门https://ztzhang.blog.csdn.net/article/details/134893…...

opencv 识别运动物体

import cv2 import numpy as npcap cv2.VideoCapture(video.mp4) try:import cv2backSub cv2.createBackgroundSubtractorMOG2() except AttributeError:backSub cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel kernel cv2.getStructuringElement(cv2.MORPH_REC…...

opencv实际应用--银行卡号识别

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;主要用于图像和视频处理、目标检测、特征提取、3D重建以及机器学习任务。它支持多种编程语言&#xff08;如C、Python&#xff09;&#xff0c;提供丰富的算法和工具&a…...

【软考系统架构设计师】系统架构设计知识点

1、 从需求分析到软件设计之间的过渡过程称为软件架构。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象&#xff0c;由构件的描述、构件的相互作用&#xff08;连接件&#xff09;、指导构件集成的模式以及这些模式的约束组成。 软件架构不仅指定了系统的组织结构和…...

GPT - 2 文本生成任务全流程

数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...

重返JAVA之路——面向对象

目录 面向对象 1.什么是面向对象&#xff1f; 2.面向对象的特点有哪些&#xff1f; 3.什么是对象&#xff1f; 4.什么是类&#xff1f; 5.什么是构造方法? 6.构造方法的特性有哪些&#xff1f; 封装 1.什么是封装&#xff1f; 2.封装有哪些特点&#xff1f; 数据隐…...

docker 安装 jenkins

拉取镜像 docker pull jenkins/jenkins:2.426.3-lts-jdk17 创建数据卷 # 创建时即设置安全权限&#xff08;SGID确保组权限继承&#xff09; sudo mkdir -p /var/jenkins_home sudo chmod -R 777 /var/jenkins_home 拉取镜像并运行容器 # 生产环境推荐&#xff08;JDK17…...

sql 向Java的映射

优化建议&#xff0c;可以在SQL中控制它的类型 在 MyBatis 中&#xff0c;如果返回值类型设置为 java.util.Map&#xff0c;默认情况下可以返回 多行多列的数据...

探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏

大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下&#xff0c;开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具&#xff0c;支持读取、预览、格式转换和导出多种测试相关文档&#xff08;YAML、JSON、DOCX…...

Python中数值计算、表格处理和可视化的应用

1.数值计算&#xff1a;Numpy import numpy as np 1.1创建数组 import numpy as np arr1 np.array([[1,2,3,4,5]]) print(arr1) print(type(arr1)) print("数组形状",arr1.shape) arr2 np.array([[1,2,3],[2,3,4]]) print(arr2) print(type(arr1)) print("…...

【数据可视化艺术·实战篇】视频AI+人流可视化:如何让数据“动”起来?

景区游玩&#xff0c;密密麻麻全是人&#xff0c;想找个拍照的好位置都难&#xff1b;上下班高峰挤地铁&#xff0c;被汹涌的人潮裹挟着&#xff0c;只能被动 “随波逐流”。这样的场景&#xff0c;相信很多人都再熟悉不过。其实&#xff0c;这些看似杂乱无章的人群流动现象&am…...

038-flatbuffers

flatbuffers FlatBuffers技术调研报告 一、核心原理与优势 FlatBuffers通过内存直接访问技术实现零拷贝序列化&#xff0c;其核心优势如下&#xff1a; 内存布局&#xff1a;数据以连续二进制块存储&#xff0c;包含VTable&#xff08;虚拟表&#xff09;和Data Object&…...

探索 Go 与 Python:性能、适用场景与开发效率对比

1 性能对比&#xff1a;执行速度与资源占用 1.1 Go 的性能优势 Go 语言被设计为具有高效的执行速度和低资源占用。它编译后生成的是机器码&#xff0c;能够直接在硬件上运行&#xff0c;避免了 Python 解释执行的开销。 以下是一个用 Go 实现的简单循环计算代码&#xff1a; …...

Pinia最基本用法

1. 定义 Store 首先&#xff0c;定义一个 Pinia Store&#xff0c;使用组合式 API 风格和 ref 来管理状态。 示例&#xff1a;stores/ids.js import { defineStore } from pinia; import { ref } from vue;export const useIdsStore defineStore(ids, () > {const ids …...

MySQL中的UNION和UNION ALL【简单易懂】

一、前言 UNION 和 UNION ALL 是 SQL 中用于合并多个查询结果集的关键字。 二、核心作用 两者均用于将多个 SELECT 语句的结果集纵向合并&#xff08;列结构需相同&#xff09;&#xff0c;但行为存在关键差异&#xff1a; 三、使用场景对比 需要去重时&#xff1a;例如合并…...

ConcurrentHashMap 源码分析

摘要 介绍线程安全集合类 ConcurrentHashMap 源码&#xff0c;包括扩容&#xff0c;协助扩容&#xff0c;红黑树节点读写线程同步&#xff0c;插入元素后累加键值对数量操作原子性实现。 1 成员变量及其对应的数据结构 底层由数组红黑树链表实现volatile long baseCount 和 v…...

一种基于学习的多尺度方法及其在非弹性碰撞问题中的应用

A learning-based multiscale method and its application to inelastic impact problems 摘要&#xff1a; 我们在工程应用中观察和利用的材料宏观特性&#xff0c;源于电子、原子、缺陷、域等多尺度物理机制间复杂的相互作用。多尺度建模旨在通过利用固有的层次化结构来理解…...

【DE2-115】Verilog实现DDS+Quartus仿真波形

【DE2-115】Verilog实现DDSQuartus仿真波形 一、任务要求二、实现步骤2.1 相位累加器2.2 波形存储器ROM2.2.1 方波模块2.2.2 正弦波形存储器 2.3 3锁相环倍频电路2.4 顶层电路设计 三、设计实现四、实验总结 一、任务要求 采用数字频率合成&#xff08;Direct Digital Frequen…...

StickyNotes,简单便签超实用

日常工作中是不是经常需要记点东西&#xff0c;但又不想用太复杂的工具&#xff1f;今天给你推荐一款超简单的桌面便签软件——StickyNotes。 下面是动图&#xff1a; 简单到极致的便签工具 StickyNotes真的是简单到不能再简单了。打开软件&#xff0c;直接输入你的便签内容&a…...

深度探索 C 语言:指针与内存管理的精妙艺术

C 语言作为一门历史悠久且功能强大的编程语言&#xff0c;以其高效的性能和灵活的底层控制能力&#xff0c;在计算机科学领域占据着举足轻重的地位。 指针和内存管理是 C 语言的核心特性&#xff0c;也是其最具挑战性和魅力的部分。深入理解指针与内存管理&#xff0c;不仅能够…...

【C++】深拷贝与浅拷贝

重开也不是不可能 ~.~ 浅拷贝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 构造函数&#xff0c;初始化指针成员ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…...

【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库

一、chart资源打包 helm package ./web-chart # 当前目录会生成一个tgz的压缩文件二、安装help push插件&#xff08;用于推送前面打包的文件&#xff0c;到镜像仓库&#xff09; .1 下载help-push二进制文件 wget https://github.com/chartmuseum/helm-push/releases/down…...

React与Vue:选择哪个框架入门?

React与Vue&#xff1a;选择哪个框架入门&#xff1f; 作为前端开发者&#xff0c;我在React和Vue两个框架间切换多次&#xff0c;常被新手问到应该从哪个入手。不同于网上那些详尽的技术比较&#xff0c;这里我想从实用角度给你一个简明对比。 两大框架核心差异 特性ReactV…...

pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9

在 PyCharm 中&#xff0c;如果你已经安装了 Python 3.9&#xff0c;并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...

STL之迭代器(iterator)

迭代器的基本概念 迭代器(iterator)模式又称为游标(Cursor)模式&#xff0c;用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解&#xff1a;Iterator模式是运用于聚合对象的一种模式&#xff0c;通过运用该模式&#…...

Mysql5.7配置文件

Mysql5.7配置文件 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 使用utf8mb4而不是utf8&#xff1a; https://blog.csdn.net/omaidb/article/details/106481406 https://blog.csdn.net/fdipzo…...

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…...

【HarmonyOS 5】敏感信息本地存储详解

【HarmonyOS 5】敏感信息本地存储详解 前言 鸿蒙其实自身已经通过多层次的安全机制&#xff0c;确保用户敏感信息本地存储安全。不过再此基础上&#xff0c;用户敏感信息一般三方应用还需要再进行加密存储。 本文章会从鸿蒙自身的安全机制进行展开&#xff0c;最后再说明本地…...