C++中的异常和智能指针
一、C++中的异常
1.1C语言中关于错误的处理(回顾)
1.1.1处理一:文件中的错误码,错误信息
C语言中,文件打开成功则返回地址,不成功返回0
FILE* fout=fopen("Test.txt","r");
cout<<fout<<endl;//打印文件内容
cout<<errno<<endl;//打印错误码编号
perror("fopen fail:");//先打印参数中的字符串,再打印错误信息
1.1.2处理二:中止程序
当遇到内存错误,assert断言时会直接终止程序
1.2C++中异常的概念
异常是一种处理错误的方式,一个函数发现错误时可以抛出异常,再由函数本身或者调用该函数的函数进行异常处理
1.3结合例子说明抛出--匹配的规则
函数的调用栈为
此时如果输入“4 0”
首先会在add中抛异常,异常对象的类型为“const char*”
进入Func()中,会发现并没有catch类型匹配,会直接跳过Func()剩下代码到main()中,
再找到匹配的catch后进行运行,打印结果
1.4函数调用链中,异常栈展开匹配规则
①首先检查throw在不在try块内部
1>在,查catch有无类型匹配
2>不在或无类型匹配,退出当前函数,沿着函数栈去调用它的函数中查找有无try,再走一遍①的逻辑,如果到达main()结束时仍无匹配,则终止程序
如
int add(int a, int b)
{if (b == 0)throw 5;elsereturn a + b;
}void Func()
{int len1, len2;cin >> len1 >> len2;cout << add(len1, len2) << endl;//此处add函数的调用不在try块内部try{}catch (size_t x){cout << x << endl;}cout << "finished Func()" << endl;
}int main()
{try {Func();}catch (const char* str){cout << str << endl;}catch (...){cout << "unknown exception" << endl;}return 0;
}
此处add函数的调用不在try块内部,不会走到size_t类型的catch上,而是会直接退回到main中,走到...
此时打印结果
②找到匹配的catch语句处理后,会继续沿当前catch子句后面执行
③除了允许抛出派生类对象,用基类捕获之外,catch的类型严格匹配
④允许catch中异常重新抛出,捕获到什么抛出什么
1.4补:实践中的做法
实践中大多会用派生类进行抛出,用基类捕获,
会在派生类中实现一个基类虚函数的多态用来打印错误信息,基类中有一个成员变量_id来对异常进行唯一标识
如:服务器开发中的异常继承体系
1.5异常中的安全问题
①构造函数要完成对象的构造和初始化,最好不要在其中抛异常,否则可能会导致对象不完整
②析构函数要完成资源的清理,最好不要在其中抛异常,否则可能会导致资源泄露
③因为异常的捕捉机制,可能会存在申请资源的代码执行了,但是释放资源的代码没有执行,如
1.3中的函数
void Func()
{int len1, len2;cin >> len1 >> len2;try{cout << add(len1, len2) << endl;}catch (size_t x){cout << x << endl;}cout << "finished Func()" << endl;
}
如果它代码中的add调用之前申请资源,打印 "finished Func()"之后释放资源,我们的实际调用过程还和例子中的一致
void Func()
{int len1, len2;cin >> len1 >> len2;try{int* arr=new int(10);cout << add(len1, len2) << endl;}catch (size_t x){cout << x << endl;}cout << "finished Func()" << endl;delete arr;arr=nullptr;}
这样一来,属于arr的那一部分资源就会出现资源泄露的问题
理想的处理方式是把arr交给RAII智能指针去处理,自动进行资源释放
1.6异常的规范相关问题
①在C++11之前,通过在函数后加throw()来明确是否可能抛异常,如
void* void Func(size_t s,void* ptr) throw();
()中为空是不会抛异常;()中有内容是可能抛哪些类型的异常
②throw()的标识体系使用起来并不方便于是在C++11中新增了关键字noexcept,用来表示函数不会抛异常;而不写该关键字默认会抛异常
③加了noexcept后还去抛异常会直接报错,就算能捕获也不会捕获
④库中提供了一个exception作为异常继承的基类,其中还有虚函数what供重写来满足需求
1.7异常的优缺点总结
优点:
①相比于错误码,可以更清晰地展示出错误的信息,甚至可以包含堆栈调用地信息,帮助程序员更好的定位bug
②传统错误码返回方式中,当深层调用函数返回错误的时候只能返回到最外层函数,而异常可以在函数调用栈进行捕获
③有些函数难以通过返回值表示错误,如
T& operator[](int i)
出错时似乎返回什么都不太合理 ,使用异常的话更好处理
缺点:
①异常的跳转捕获机制会使调试的成本增大
②C++中无“垃圾自动回收机制”(java和phthon等为了避免资源泄露,都加上了资源自动销毁的“垃圾自动回收机制”),资源可能会出现内存泄露的问题,但可以通过RAII智能指针来规避
③异常的使用必须要规范,该加noexcept要加,这对程序员来说要求会高一些
二、C++中的智能指针
2.1什么是智能指针
智能指针又称RAII,是Resource Acquisition Is Initialization的缩写
即“资源获得立即初始化”
是利用对象生命周期控制程序资源,在主动构造时获取资源,自动调用析构时释放资源
2.2简单的智能指针示例
template<class T>
class Smart_ptr
{
public:Smart_ptr(T* ptr):_ptr(ptr){}~Smart_ptr(){delete _ptr;}private:T* _ptr;
};//设置一个简单的自定义类型
struct A
{int _a;
};void func()
{A* a1=new A;A* a2=new A;SmartPtr<A> pt1(a1);SmartPtr<A> pt2(a2);
}
在这段示例中,自定义类型A是由new进行申请,但函数结束也没有主动去释放,而是由SmartPtr自动进行析构的调用
2.3智能指针的拷贝中出现的问题
2.3.1在2.2的例子中会出现的问题
假如此时添加这样一段代码
SmartPtr<A> pt3(pt2);
会发生什么呢?
在SmatrPtr中,拷贝构造是默认生成的,会进行浅拷贝,这样以后,
pt3与pt2会指向同一块申请出来的空间,因此会有析构两次的风险
2.3.2库中的智能指针auto_ptr拷贝的原理
最早出现的智能指针就是auto_ptr,在C++98就已经支持了
template <class X> class auto_ptr;
它显式实现了拷贝构造,但是如果我们这样去用
auto_ptr<A> pt4(new A);
auto_ptr<A> pt5(pt4);
会直接让pt4变空, auto_ptr<A> pt5(pt4);这行代码的本质是管理权转移
但实际使用过程中很少用到
2.3.3boost库及其中的智能指针
boost是在2003-2011年之间产生的,常被称为“准C++标准库”,可以包<boost>头文件来使用
其中有三个常用的智能指针:
scoped_ptr:禁止拷贝
shared_ptr:通过引用计数的方式进行拷贝
weak_ptr:不同于上两个,它不支持直接管理资源(故不符合RAII),它的存在是为了解决shared_ptr的一个缺陷:循环引用导致资源泄露
2.3.4自boost库衍生:C++11中的常用智能指针
C++11中将boost库中几个智能指针移过来了,包括
unique_ptr:把scoped_ptr换了个名字
shared_ptr:直接移植
weak_ptr:直接移植
2.4定制删除器
2.4.1定制删除器的意义
默认的析构中调用的都是delete
但如果遇到如自定义类型,如
unique_ptr<A> up1(new A[5]);//需要delete[] _ptr
这类的需要其他删除资源方式的自定义类型,库中的析构明显就不够了
2.4.2unique_ptr中的定制删除器
需要在模板中传入定制删除器,如
template<class T>
struct ArrayDelete
{void operator(T* ptr){delete[] ptr;}
};
unique_ptr创建过程改为
unique_ptr<A,ArrayDelete<A>> up1(new A[5]);
补:实际上因为数组类型常用,库中也提供过类模板
unique_ptr:
template <class T, class D> class unique_ptr<T[],D>;
使用时:
unique_ptr<A[]> up1(new A[5]);
2.4.3shared_ptr中的定制删除器
不同于unique_ptr中在类模板中传入,shared_ptr是直接在函数参数列表里传可调用对象
这也意味着匿名类,lambda表达式,function等都可以直接使用
声明:
template <class U, class D, class Alloc> shared_ptr (U* p, D del, Alloc alloc); template <class D, class Alloc> shared_ptr (nullptr_t p, D del, Alloc alloc);
使用举例:
struct Deletefile
{void operator()(FILE* file){fclose(file);}
};
shared_ptr<FILE> sp2(fopen("text.txt","r"),Deletefile());
2.5快捷构建shared_ptr的make_shared函数模板
有时需要直接使用shared_ptr类型对象,如在使用weak_ptr的过程中
此时就需要用上支持可变模板参数列表的make_shared函数模板
template <class T, class... Args>shared_ptr<T> make_shared (Args&&... args);
如:
shared_ptr<Date> sp3 = make_shared<Date>(2025,3,26);
三、智能指针的模拟实现
3.1auto_ptr
基础的功能与2.2中的SmartPtr基本一致
其拷贝构造类似于
auto_ptr(auto_ptr<T>& ap)
:_ptr(ap._ptr)
{ap._ptr=nullptr;}
3.2unique_ptr
即直接将拷贝构造和赋值重载置为delete
3.3shared_ptr
3.3.1基础功能的实现
拷贝时的计数逻辑是核心,其解决思路是通过成员变量额外设置值来辅助判断是否需要析构
这个值需要脱离对象本身,因为影响这个值的核心是“指向一块内存的对象数目”
①首先考虑使用静态成员变量int _pcount,但这会出现一个问题:虽然可以统计指向一块内存的资源个数,可如果有两块内存就无法进行合理划分了
②为了解决①中的问题,可以考虑给int*类型的_pcount,如果多块内存,就让指针指向不一样的空间
拷贝构造时:每次复制以后++对应_pcount
赋值重载:可能会出现接受赋值对象原来就指向一块空间的情况,因此需要走
析构逻辑+拷贝构造
3.3.2定制删除器的实现
可以用包装器来包装可调用对象,需要有缺省值,因为析构函数中我们不能再只用delete了,而要去调用_del
function<void(T* ptr)> _del = [](T* ptr) {delete ptr; };
为了正常使用包装器,我们还需要补充一个模板构造函数
template<class D>shared_ptr(T* ptr,D del):_ptr(ptr), _pcount(new int(1)),_del(del){}
3.3.3示例代码:
template<class T>
class shared_ptr
{
public:shared_ptr(T* ptr):_ptr(ptr), _pcount(new int(1)){}template<class D>shared_ptr(T* ptr,D del):_ptr(ptr), _pcount(new int(1)),_del(del){}shared_ptr(const shared_ptr& sp):_ptr(sp._ptr), _pcount(sp._pcount){++(*_pcount);}void delete_sp(){if (--(*_pcount) == 0){_del(_ptr);delete _pcount;_ptr = nullptr;_pcount = nullptr;}}shared_ptr& operator=(const shared_ptr& sp){if (_ptr != sp._ptr){delete_sp();_ptr = sp._ptr;_pcount = sp._pcount;++(*_pcount);}return *this;}int use_count(){return *_pcount;}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}~shared_ptr(){delete_sp();}private:T* _ptr;int* _pcount;//定制删除器,服务于T的特定析构方式function<void(T* ptr)> _del = [](T* ptr) {delete ptr; };};
3.3.4循环引用:会导致内存泄漏
场景:
struct ListNode
{int _data;shared_ptr<ListNode> _next;//直接将资源交给shared_ptr管理shared_ptr<ListNode> _prev;
};int main()
{shared_ptr<ListNode> n1(new ListNode);shared_ptr<ListNode> n2(new ListNode);n1->_next=n2;n2->_prev=n1;return 0;
}
此时n1与n2的关系是:
一旦析构:
首先,n1与n2析构后,计数减到1
然后问题就来了:
①右边节点什么时候释放?
_next析构,则右边节点释放
②_next什么时候析构?
_next为左边节点成员,左边节点析构,_next析构
③左边节点什么时候释放?
_prev析构,则左边节点释放
④_prev什么时候析构?
_prev为右边节点成员,右边节点析构,_prev析构
这里①-④形成了一个逻辑闭环,最后造成谁也没析构/释放,出现资源泄露
3.3.5循环引用的解决:weak_ptr
它的存在就是为了解决循环引用的问题,特点是使用shared_ptr传参时,构造/赋值时引用计数不增加
注意:weak_ptr不支持直接管理资源,即不支持RAII
它的声明中有传参
template <class U> weak_ptr (const shared_ptr<U>& x) noexcept;
可以利用make_shared传入
此外,weak_ptr是有计数的,只是计数不增加;他也有use_count()接口
四、内存泄漏
4.1什么是内存泄漏
指因疏忽或错误造成程序未能释放已不再使用的内存的情况
4.2内存泄露的危害
对于长期运行的程序,会导致响应越来越慢,最终卡死
相关文章:
C++中的异常和智能指针
一、C中的异常 1.1C语言中关于错误的处理(回顾) 1.1.1处理一:文件中的错误码,错误信息 C语言中,文件打开成功则返回地址,不成功返回0 FILE* foutfopen("Test.txt","r"); cout<&…...
Selenium 简单入门操作示例
最简单的 Selenium 示例(Python版) 下面是一个完整的、最简单的 Selenium 操作示例,带你快速上手: from selenium import webdriver from selenium.webdriver.common.by import By import time# 1. 启动浏览器(这里使…...
6.1 模拟专题:LeetCode 1576. 替换所有的问号
1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s,要求将所有 ? 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同。 示例: 输入:s "?zs" →…...
前端知识点---用正则表达式判断邮箱(javascript)
// 全面的正则(兼容大多数情况) const emailRegex /^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/;// 或直接使用浏览器内置验证 <input type"email" required>/:正则表达式的起始和结束标志。 ^:匹配字符串的…...
深度剖析 Spring 源码 性能优化:核心原理与最佳实践
深度剖析 Spring 源码 & 性能优化:核心原理与最佳实践 🚀 Spring 框架 作为 Java 生态的核心技术,广泛应用于企业级开发。但很多开发者只会“用”Spring,而不深入其内部原理,导致无法高效排查问题 & 进行性能优…...
Axure RP9教程 :轮播图(动态面板) | 头部锁定
文章目录 引言I 轮播图操作步骤在画布中添加一个动态面板设置面板状态II 头部锁定将头部区域选中,右键组合或用Ctrl+G快捷键;将组合的头部区域,右键创建动态面板;引言 动态面板的功能十分强大,比如:拥有独立的内部坐标系,有多个状态; Banner的案例中会用到动态面板多个…...
rabbitmq承接MES客户端服务器
文章目录 背景整体架构概述方案详细步骤1. 数据库选型与搭建2. 设备端数据上传至数据库3. 搭建 RabbitMQ 服务器4. 数据同步模块(数据库到 RabbitMQ)5. MES 服务器从 RabbitMQ 接收数据6. 指令接收模块(RabbitMQ 到设备端) 7. MES…...
重学vue3(三):vue3基本语法及使用
组合式 API是vue3 的核心特性,替代 Vue2 的选项式 API,强调逻辑复用和代码组织。基本语法如下: <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 响应式数据 const count ref(0); // 基本类…...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
0322-数据库与前后端的连接、数据库表的增删改查
前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…...
详细介绍Qt中用于断言的宏 Q_ASSERT
Q_ASSERT 是 Qt 框架中用于调试的核心宏之一,其作用类似于标准 C/C 的 assert,但针对 Qt 的特性进行了优化。它用于在开发阶段验证程序的逻辑正确性,帮助开发者快速定位潜在的错误。 1.基本用法 Q_ASSERT(condition);功能:在调试…...
基于Python的自然语言处理系列(60):使用 LangChain 构建 Multi-Vector Retriever 进行文档检索
在 NLP 和 AI 领域,基于嵌入(Embeddings)进行文档检索已成为一种高效的解决方案。本文介绍如何使用 LangChain 构建 Multi-Vector Retriever,实现对长文档的分块索引和高效检索。 1. 环境准备 首先,我们需要安装相关…...
Dify 部署指南-离线版
Docker 部署 1、 访问 Docker 官网 (https://www.docker.com/) 获取安装包。 2、 上传 Docker 安装包 3、 进入解压目录,执行解压命令 tar xzvf docker-28、0.2、tgz4、 将解压文件中的 Docker 相关文件移动到 /usr/bin/ 目录 sudo cp docker/* /usr/bin/5、 创建…...
解决 Element UI 嵌套弹窗的状态管理问题!!!
解决 Element UI 嵌套弹窗的状态管理问题 🔧 问题描述 ❓ 在使用 Element UI 开发一个多层嵌套弹窗功能时,遇到了以下问题: 弹窗只能打开一次,第二次点击无法打开 🚫收到 Vue 警告:避免直接修改 prop 值…...
基于STM32单片机的智能手环/音乐播放/语音识别
基于STM32单片机的智能手环/音乐播放/语音识别 持续更新,欢迎关注!!! ** 基于STM32单片机的智能手环/音乐播放/语音识别 ** 21世纪,社会高速发展,生活物质越来越丰富,随着科技的进步,智能化成为了人们关注的焦点&am…...
NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台
目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码(Android/Kotlin 简化示例) 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码(Node.js Express 简化示例) …...
使用 Python 开发 MCP Server 及 Inspector 工具详解
使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议,旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server,并详细讲解如何使…...
论坛系统测试报告
一、项目背景 为论坛系统项目设计并进行自动化测试。论坛系统由六个页面构成:用户登录页、用户注册页、个人中心页面、我的帖子页面、帖子编辑页、帖子列表页以及帖子详情页。 通过使用selenium工具来定位到web中的元素,对获取到的元素进行自动化测试等操…...
Android一个APP里面最少有几个线程
Android应用启动时,默认会创建一个进程,该进程中最少包含5个系统自动创建的线程,具体如下: Main线程(主线程/UI线程) 负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应…...
DML 数据操纵语言学习笔记
一、DML 核心概念体系 1.1 语言定位与边界 DML(Data Manipulation Language)作为 SQL 三大核心语言之一,专注于数据行级操作,区别于 DDL(结构定义)和 DCL(权限控制)。其核心指令包…...
7-Zip 功能介绍
7-Zip 是一款开源、高效的文件压缩与解压缩工具,支持多种格式,以高压缩率和灵活性著称。以下是其核心功能: 多格式支持 压缩 / 解压:支持 7z(默认格式,压缩率极高)、ZIP、RAR、GZIP、BZIP2、TAR…...
《基于python游戏设计与实现》开题报告
个人主页:@大数据蟒行探索者 一、研究背景、目的及意义 (一)研究背景 游戏的普及与成功:随着智能手机的普及和网络技术的发展,手机游戏产业逐渐成熟,成为娱乐文化产业的重要组成部分。《开心消消乐》作为一款休闲类游戏,自上线以来凭借其简单易上手的玩法和丰富的…...
鸿蒙学习笔记(3)-像素单位、this指向问题、RelativeContainer布局、@Style装饰器和@Extend装饰器
一、像素单位 物理像素:用px表示。 逻辑像素:在布局的时候,底层针对物理像素和屏幕尺寸关系进行转化的中间层。 分辨率:代表在屏幕上到底布局了多少了像素点(发光点) 官方同时也提供了相关单位,在开发中…...
Selenium之简介
Selenium简介 首先,让我们看看官网是怎么定义的 Selenium是一个支持web浏览器自动化的一系列工具和库的综合项目,提供了扩展来模拟用户和浏览器的交互,用于扩展浏览器分配的分发服务器;用于W3C WebDriver规范的基础架构 其实&a…...
使用Ollama(自定义安装位置)与RagFlow构建本地知识库
目录 1. 为什么不直接使用网页版DeepSeek?2. 如何实现网页版DeepSeek不能实现的需求?3. 目标效果预览4. 为什么要使用RAG技术?RAG和模型微调的区别?5. 什么是Embedding?为什么需要“Embedding模型”?6. 本地部署全流程6.1 下载ollama,通过olama将DeepSeek模型…...
基于ssm的医院预约挂号系统
一、系统架构 前端:jsp | bootstrap | jquery | css | ajax 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 首页 04. 医院挂号 05. …...
如何通过less在vue2中达到切换皮肤的目的
先装less npm install less less-loader --save-dev 然后将该 loader 添加到 webpack 的配置中去,例如: webpack.config.js module.exports {module: {rules: [{test: /\.less$/i,use: [// compiles Less to CSSstyle-loader,css-loader,less-loade…...
DeepSeek概述
一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家专注 通用人工智能(AGI,Artificial General Intelligence)的中国科技公司,主攻大数据研发与应用。DeepSeek-R1是其开源的推理模型,擅长处理复杂任务且可免费商用…...
生成模型速通(Diffusion,VAE,GAN)
基本概念 参考视频https://www.bilibili.com/video/BV1re4y1m7gb/?spm_id_from333.337.search-card.all.click&vd_sourcef04f16dd6fd058b8328c67a3e064abd5 生成模型其实是主要是依赖概率分布,对输入特征的概率密度函数建模 隐空间(latent space)…...
linux/android 如何获取当前系统启动时长
uptime 指令获取 trinket:/ # uptime12:03:31 up 3 min, 0 users, load average: 1.02, 0.68, 0.29...
Elasticsearch客户端工具初探--kibana
1 Kibana简介 Kibana是Elastic Stack(ELK)中的可视化工具,用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面,支持日志分析、业务监控、数据探索等功能,广泛应用于运维监控、安全分析…...
深克隆和浅克隆(建造者模式,内含简版)
让我们来看一个例子: 设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。 代码实现 Customer类和Address类都是实现的Java 内置的 java.lang.Cloneable …...
吴恩达机器学习笔记复盘(十二)逻辑回归的梯度下降和拟合问题
梯度下降算法推导过程 一、逻辑回归模型基础 逻辑回归用于二分类问题,其假设函数为sigmoid函数: 其中,是模型参数向量,是特征向量。输出表示样本属于正类的概率。 二、损失函数 逻辑回归的损失函数采用 对数损失(交…...
OSPF五种报文分析(仅部分比较重要的)
OSPF五种报文分别是: hello报文,DBD数据库描述报文,LSR链路状态请求报文,LSU链路状态更新报文,LSACK链路状态确认包 以下是这五种报文的详细解读: 1. Hello报文 作用: 用于邻居的发现、建立和…...
Ubuntu 22.04 二进制安装单节点 MySQL
Ubuntu 22.04 二进制安装 MySQL LTS(长期支持版)完整教程 MySQL LTS 版本选择: 目前 MySQL 8.4.4 是长期支持(LTS)版本,持续更新并保持稳定。 下载版本: 你也可以在 MySQL 官方网站确认最新稳…...
python处理音频相关的库
1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数,生成wav文件 def record(file_name):try:os.close(file_…...
python+ffmpeg给音频添加背景音乐
说明: 我希望用python,将name.mp3这段录音文件,添加背景音乐,bg.mp3,然后生成新的文件 step1: 添加依赖 pip install pydubstep2:下载ffmpeg 1.打开windows powershell ,管理员运行 2.winget install ff…...
《TypeScript 面试八股:高频考点与核心知识点详解》
“你好啊!能把那天没唱的歌再唱给我听吗? ” 前言 因为主包还是主要学习js,ts浅浅的学习了一下,在简历中我也只会写了解,所以我写一些比较基础的八股,如果是想要更深入的八股的话还是建议找别人的。 Ts基…...
鸡生蛋还是蛋生鸡? 基于python的CCM因果关系计算
文章目录 前言一、安装二、代码1.全部代码2.结果展示总结前言 因果推断在科学研究中起着重要的作用,尤其是在复杂系统中,例如生态学、气候学、经济学等领域。在这些领域中,了解变量之间的因果关系可以帮助我们更好地理解系统的动态行为和相互作用。传统的相关性分析并不足以…...
PyBluez2 的详细介绍、安装指南、使用方法及配置说明
PyBluez2:Python 蓝牙开发的核心库 一、PyBluez2 简介 PyBluez2 是 Python 的开源蓝牙编程库,支持蓝牙 2.0、BLE(低功耗蓝牙)和传统蓝牙协议栈的开发。它提供了对蓝牙硬件适配器的底层控制,适用于设备发现、配对、数…...
鸿蒙HarmonyOS NEXT之无感监听
鸿蒙中存在一些无感监听,这些监听经过系统API封装使用很简单,但是对实际业务开发中有很重要,例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转,如果你想知…...
质检LIMS系统在食品生产加工企业的应用 如何保证食品生产企业的安全
在食品生产加工领域,质量安全是贯穿全产业链的生命线。随着《食品安全法》对全过程追溯要求的深化,传统实验室管理模式已难以满足高效、精准的质量管控需求。质检实验室信息管理系统(LIMS)作为数字化升级的核心工具,正…...
linux中如何获取其他进程的退出状态
进程的退出状态至关重要,用wait系列函数,父进程可以捕捉到子进程的退出状态,若给定任意进程,其父进程已经确定,无法改变,自己如何获取到其退出状态呢。 可以用ptrace系统api attach到相应的进程,…...
【android】补充
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…...
Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战
Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战 引言 在分布式系统和本地服务通信中,进程间通信(IPC)与远程过程调用(RPC)是核心能力。本文将深入剖析 Unix Domain Socket(UDS)、IPC、RP…...
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
小T导读:TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用…...
华为OD机试A卷 - 积木最远距离(C++ Java JavaScript Python )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处…...
Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步
一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统,执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…...
C++设计模式-桥梁模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
一、桥梁模式基本介绍 桥梁模式(Bridge Pattern)是一种结构型设计模式,又叫桥接模式,其核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合代替继承,有效解决了多层继承导致的类爆…...
系统转换、系统维护、净室软件工程、构件软件工程(高软51)
系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...