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

C++智能指针的知识!

个人主页:PingdiGuo_guo

收录专栏:C++干货专栏

大家好呀,我是PingdiGuo_guo,今天我们来学习一下智能指针。

文章目录

1.智能指针的概念

2.智能指针的思想

3.智能指针的作用

3.1 自动内存管理

 3.2 共享所有权

3.3 避免悬挂指针

4.智能指针的操作

         4.1 初始化

4.2 拷贝与移动

4.3 访问与解引用

5.智能指针的分类

5.1 unique_ptr(独占指针)

5.2 shared_ptr(共享指针)

5.3 weak_ptr(弱指针)

5.4 auto_ptr(自动指针)

6.智能指针的练习

6.1题目

6.2步骤

6.3完整代码

7.注意事项

8.智能指针和常规指针的对比

8.1功能和使用方式

8.2内存管理

8.3安全性

8.4总结

9.总结


1.智能指针的概念


智能指针是在C++中用于管理堆内存的对象,它是C++标准库提供的一个抽象层,用来封装原始的裸指针。智能指针本质上是一个类,它有一个指向动态分配对象的成员变量,并且该类重载了运算符和其他必要的方法,以便在适当的时间自动释放所指向的对象。这相当于把资源管理的责任从程序员转移到了智能指针对象上,遵循了RAII(Resource Acquisition Is Initialization)的原则。


2.智能指针的思想


智能指针的核心思想在于将内存资源的生命周期绑定到某个特定的对象(智能指针对象)上,而不是依赖于程序执行流程中的某些逻辑判断来决定何时释放内存。当智能指针对象不再需要(例如,出了作用域或被删除时),它会自动清理自己管理的内存,从而消除因忘记释放内存而导致的内存泄漏问题。


3.智能指针的作用


3.1 自动内存管理

智能指针能确保在其生命周期结束后自动释放其管理的堆内存资源。

 3.2 共享所有权

某些类型的智能指针(如std::shared_ptr)支持多个智能指针共享同一份动态分配的内存,只有当所有共享此内存的智能指针都被销毁时,内存才会真正释放。

3.3 避免悬挂指针

智能指针通过维护内部计数器或其他机制,可以防止在内存已经被释放后仍访问该内存的情况,从而避免悬挂指针错误。



4.智能指针的操作

4.1 初始化

创建智能指针时,可以通过传递给构造函数一个new表达式的结果来初始化智能指针,使其开始管理一块内存。
 

std::unique_ptr<int> uptr(new int(42));



4.2 拷贝与移动


- 普通拷贝:对于std::unique_ptr来说,拷贝构造函数和赋值运算符被禁用,因为唯一所有权不允许复制;而对于std::shared_ptr,拷贝会增加引用计数。
- 移动操作:智能指针通常支持移动构造函数和移动赋值运算符,它们会转移资源的所有权,使得原智能指针变为空指针,而目标智能指针接管资源管理。



4.3 访问与解引用

智能指针提供了类似于普通指针的操作,可以通过->运算符访问成员,或者通过解引用运算符*直接访问对象。
 

std::cout << *uptr; // 输出42
uptr->some_method(); // 调用智能指针所指对象的方法

5.智能指针的分类

智能指针通常分为以下几类:

5.1 unique_ptr(独占指针)

unique_ptr是C++11引入的一种独占式智能指针,它通过使用“独占权”来确保资源的单一所有者。这意味着在同一时间只有一个unique_ptr可以拥有一个资源,并且当unique_ptr销毁时,它所拥有的资源会被自动释放。

#include <memory>int main() {std::unique_ptr<int> ptr(new int);*ptr = 10;// unique_ptr会在作用域结束时自动释放资源return 0;
}

5.2 shared_ptr(共享指针)

shared_ptr是一种通过“引用计数”来共享资源的智能指针。它可以有多个shared_ptr同时拥有同一个资源,每个shared_ptr都会维护一个计数器,用于追踪资源的引用数。只有当引用计数降为0时,资源才会被释放。


 

#include <memory>int main() {std::shared_ptr<int> ptr1(new int);std::shared_ptr<int> ptr2 = ptr1;*ptr1 = 10;*ptr2 = 20;// 此时引用计数为2return 0;
}

5.3 weak_ptr(弱指针)

weak_ptr是一种特殊的共享指针,它可以“观测”shared_ptr的资源,而不拥有该资源。weak_ptr并不会影响资源的生命周期,当其所观测的资源被释放后,weak_ptr会自动变为空指针。


 

#include <memory>int main() {std::shared_ptr<int> ptr(new int);std::weak_ptr<int> weakPtr = ptr;// 此时weakPtr观测ptr所指向的资源ptr.reset();// 此时资源已被释放,weakPtr变为空指针return 0;
}

5.4 auto_ptr(自动指针)

auto_ptr是C++98中提供的一种智能指针,用于进行简单的资源管理。与unique_ptr类似,auto_ptr也是一种独占式的智能指针,但它的语义和行为比较特殊,容易引发一些不可预料的问题。由于其语义问题,auto_ptr在C++11中已被弃用。

#include <memory>int main() {std::auto_ptr<int> ptr(new int);*ptr = 10;// auto_ptr会在作用域结束时自动释放资源return 0;
}


 

总结起来,智能指针是C++中一种方便且安全的资源管理工具。通过使用智能指针,我们能够避免手动管理内存资源的复杂性和潜在错误,提高代码的可靠性和可维护性。

6.智能指针的练习

6.1题目

实现一个具有引用计数功能的智能指针类,用于管理动态分配的整型数据。

6.2步骤

1. 创建一个智能指针类SmartPointer,其中包含一个指向整型数据的指针和一个整型的引用计数变量。在构造函数中,为指针分配内存并将引用计数初始化为1。

#include <iostream>class SmartPointer {
public:SmartPointer(int* pData) : m_pData(pData), m_pCount(new int(1)) {std::cout << "Create SmartPointer with data " << *m_pData << std::endl;}// 省略其他成员函数
private:int* m_pData;int* m_pCount;
};

2. 实现拷贝构造函数,它将另一个SmartPointer对象作为参数。在拷贝构造函数中,将指针和引用计数变量分别指向原始对象的成员,并将引用计数递增。

SmartPointer(const SmartPointer& other) : m_pData(other.m_pData), m_pCount(other.m_pCount) {++(*m_pCount);std::cout << "Copy SmartPointer with data " << *m_pData << std::endl;
}


3. 实现析构函数,用于在引用计数变为0时释放内存。在析构函数中,将引用计数递减,若引用计数为0,则释放指针指向的内存。

~SmartPointer() {--(*m_pCount);if (*m_pCount == 0) {delete m_pData;delete m_pCount;std::cout << "Delete SmartPointer with data " << *m_pData << std::endl;}
}


 

4. 重载赋值运算符,用于实现对象的赋值操作。在赋值运算符中,需要先递减原对象的引用计数,然后再递增赋值对象的引用计数。



 

SmartPointer& operator=(const SmartPointer& other) {if (this != &other) {--(*m_pCount);if (*m_pCount == 0) {delete m_pData;delete m_pCount;std::cout << "Delete SmartPointer with data " << *m_pData << std::endl;}m_pData = other.m_pData;m_pCount = other.m_pCount;++(*m_pCount);std::cout << "Assign SmartPointer with data " << *m_pData << std::endl;}return *this;
}

5. 创建一个测试函数,在函数中创建多个SmartPointer对象,并进行赋值操作。

void test() {SmartPointer sp1(new int(5));SmartPointer sp2(sp1);SmartPointer sp3(new int(10));sp3 = sp2;
}


 

6. 在主函数中调用测试函数并观察输出结果。


 

int main() {test();return 0;
}

6.3完整代码


 

#include <iostream>class SmartPointer {
public:SmartPointer(int* pData) : m_pData(pData), m_pCount(new int(1)) {std::cout << "Create SmartPointer with data " << *m_pData << std::endl;}SmartPointer(const SmartPointer& other) : m_pData(other.m_pData), m_pCount(other.m_pCount) {++(*m_pCount);std::cout << "Copy SmartPointer with data " << *m_pData << std::endl;}~SmartPointer() {--(*m_pCount);if (*m_pCount == 0) {delete m_pData;delete m_pCount;std::cout << "Delete SmartPointer with data " << *m_pData << std::endl;}}SmartPointer& operator=(const SmartPointer& other) {if (this != &other) {--(*m_pCount);if (*m_pCount == 0) {delete m_pData;delete m_pCount;std::cout << "Delete SmartPointer with data " << *m_pData << std::endl;}m_pData = other.m_pData;m_pCount = other.m_pCount;++(*m_pCount);std::cout << "Assign SmartPointer with data " << *m_pData << std::endl;}return *this;}private:int* m_pData;int* m_pCount;
};void test() {SmartPointer sp1(new int(5));SmartPointer sp2(sp1);SmartPointer sp3(new int(10));sp3 = sp2;
}int main() {test();return 0;
}

7.注意事项

使用智能指针时,有一些注意事项需要注意:

1.避免循环引用:循环引用指的是两个或多个对象相互持有对方的智能指针,导致引用计数始终不为0,从而造成内存泄漏。为了避免循环引用,应该尽量使用弱引用(std::weak_ptr)或者使用裸指针来解除循环引用。

2.避免使用裸指针:为了避免手动管理内存和潜在的内存泄漏,应该尽量使用智能指针来管理动态分配的内存。避免将裸指针传递给智能指针,以防止多个智能指针管理同一个内存块。

3.不要将裸指针和智能指针混合使用:在代码中,应该始终使用智能指针来管理动态分配的内存。避免将裸指针和智能指针混合使用,否则可能导致重复释放内存或内存泄漏。

4.使用std::make_sharedstd::make_unique来创建智能指针:std::make_sharedstd::make_unique是用来创建智能指针的函数模板,它们可以保证在创建智能指针时同时分配内存,避免了显式地使用new操作符。

5.当需要使用原始指针时,使用get获取原始指针:在某些情况下,可能需要将智能指针转换为原始指针。可以使用get成员函数来获取智能指针内部的原始指针。

6.避免在多线程中共享智能指针:智能指针的引用计数机制在多线程中可能引发竞争条件。如果需要在多线程中共享智能指针,应该采取适当的同步措施来确保线程安全。

总之,使用智能指针可以减少内存泄漏的风险,简化内存管理,但也需要注意上述的注意事项来避免潜在的问题。

8.智能指针和常规指针的对比

8.1功能和使用方式

智能指针:智能指针是C++标准库提供的一种数据类型,用于管理动态分配的内存资源。

智能指针可以自动释放内存资源,避免内存泄漏的问题。

智能指针一般采用引用计数的方式,当没有引用指向对象时,会自动释放内存。

智能指针可以像常规指针一样操作对象,可以通过操作符重载来访问对象的成员。

常规指针:常规指针是C/C++语言中的基本概念,用于存储对象的内存地址。

常规指针需要手动管理内存的申请和释放,容易出现内存泄漏和悬空指针的问题。

常规指针可以进行指针运算,如加减操作符来移动指针的位置。

8.2内存管理

智能指针:智能指针通过引用计数或其他方式来自动管理内存,在对象不再被引用时自动释放内存,避免了内存泄漏和悬空指针的问题。

常规指针:常规指针需要手动申请和释放内存,容易出现内存泄漏和悬空指针的问题。

8.3安全性

智能指针:智能指针具有类型安全性,可以在编译时检查类型是否匹配,避免了类型错误的问题。

常规指针:常规指针没有类型安全性,可以进行任意类型的转换,容易出现类型错误。

8.4总结

智能指针相比于常规指针具有自动内存管理、类型安全等优点,能够提高程序的可靠性和安全性。然而,智能指针也会带来一些额外的开销和循环引用等问题。常规指针更为灵活,但需要手动管理内存,容易出现内存泄漏和悬空指针等问题。选择使用智能指针还是常规指针要根据具体的需求和场景来决定。

9.总结

本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,谢谢大家啦!

相关文章:

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…...

4.6 实现重定向

本实战通过ServletDemo09类演示了Servlet中的重定向功能。该Servlet通过HttpServletResponse的sendRedirect方法实现页面跳转。在doPost方法中&#xff0c;根据请求参数username和password判断用户身份。若用户名为admin且密码为123456&#xff0c;则调用sendRedirect方法将页面…...

Linux中的管道

管道的概念 管道是一种进程间通信的方式。 管道是一种半双工通信机制&#xff0c;数据只能读或写&#xff0c;如果要读写同时进行就要创建两个管道 管道的类型 1、匿名管道PIPE&#xff1a;通常在亲缘进程中使用&#xff08;兄弟、父子&#xff09; 函数参考&#xff1a;匿名管…...

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异&#xff0c;如何量化&#xff1f; 计算真实概论分布P信息量 和 估计概论分布为Q&#xff0c;但实际概率分布为P时信息量的差值 那么设&#xff0c;概率分…...

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)

一、每个阶段的 UAV—架构革新与限制突破 在 Microsoft Direct3D 11 中&#xff0c;计算着色器 (UAV) 的无序访问视图数限制为 8 个&#xff0c; (像素着色器) RTV) UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中&#xff0c;可绑定的数量已增加。 对于 DirectCompute&a…...

机械臂速成小指南(二十五):机械臂与人工智能的有机结合

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在我的主页中寻找哦&#x1f916;&#x1f63d;&#x1f984; ​ ​指南目录&#x1f4d6;&#xff1a; &#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&…...

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…...

Git学习之路(Updating)

常用命令 pwd &#xff1a;显示当前目录 git init: 在当前目录下创建一个新的仓库&#xff08;空的&#xff09; git add name.type&#xff1a;将文件添加到仓库 git commit -m "xx备注xx" &#xff1a;把文件提交到仓库。git commit一次可以提交很多文件。 git …...

【datawhaleAI春训营第一期笔记】AI+航空安全

记录了一些数据竞赛相关的知识&#xff0c;赛题的代码相关笔记可以从目录寻找 目录 数据竞赛知识前置知识TPOP竞赛分类&#xff1a; 机器学习基础线性模型树模型KNN模型神经网络 深度学习全连接网络深度学习正则化深度学习的优化卷积神经网络 竞赛基础知识数据清洗特征工程模型…...

pnpm解决幽灵依赖问题

文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗&#xff1f;2. pnpm 解决了幽灵依赖问题吗&#xff1f;3. pnpm 是如何解决的&#xff1f;举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1&#xff1a;初始化项目并安装依赖步骤2&#xf…...

梯度下降代码

整体流程 数据预处理:标准化->加一列全为1的偏置项 训练:梯度下降,将数学公式转换成代码 预测 模型代码 import numpy as np# 标准化函数&#xff1a;对特征做均值-方差标准化 # 返回标准化后的特征、新数据的均值和标准差&#xff0c;用于后续预测def standard(feats…...

七、LangChain Tool类参数对接机制解析:基于Pydantic的类型安全与流程实现

LangChain 的 Tool 类(包括 BaseTool 和 StructuredTool)通过 参数校验、输入解析、函数调用 的流程,将外部函数与 Agent 的逻辑对接。以下是其内部逻辑的详细解析: 1. 工具与函数对接的核心机制 (1) 工具的定义方式 LangChain 提供了两种主要方式定义工具: 继承 BaseTo…...

AIGC产品如何平衡用户体验与内容安全?

当ChatGPT能写诗、Sora会拍电影、AI主播24小时带货时&#xff0c;一场关于“AI说什么”的隐形战争&#xff0c;正在算法与监管的夹缝中悄然爆发。 从DeepSeek的冲击到多模态技术的祛魅&#xff0c;AIGC正在重塑内容创作的边界。但同时&#xff0c;诸多质疑也正在发声&#xff…...

uniapp打包报错,

######错误解决方案###### 错误描述&#xff1a; Android minSdkVersion配置问题 解决方案&#xff1a; 项目中配置的Android minSdkVersion比三方库中声明的minSdkVersion低&#xff0c;参考文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/app-android-minsdkversion…...

PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 PC主板及CPU ID 信息物理 MAC地址获取win11 新电脑 wmic 安装❤️ 欢迎一起学AI…...

2025妈妈杯数学建模D题完整分析论文

问题1的解题思路围绕建立货量预测模型以预测未来1天各线路货量&#xff0c;并将货量拆解到10分钟颗粒度展开。首先需要对数据进行预处理&#xff0c;读取四个Excel文件&#xff08;附件1、附件3、附件4、附件5&#xff09;&#xff0c;获取各文件中工作表名称&#xff0c;发现均…...

python-图片分割

图片分割是图像处理中的一个重要任务&#xff0c;它的目标是将图像划分为多个区域或者对象&#xff0c;例如分割出物体、前景背景或特定的部分。在 Python 中&#xff0c;常用的图片分割方法包括传统的图像处理技术&#xff08;例如阈值分割、区域生长等&#xff09;和深度学习…...

AI——K近邻算法

文章目录 一、什么是K近邻算法二、KNN算法流程总结三、Scikit-learn工具1、安装2、导入3、简单使用 三、距离度量1、欧式距离2、曼哈顿距离3、切比雪夫距离4、闵可夫斯基距离5、K值的选择6、KD树 一、什么是K近邻算法 如果一个样本在特征空间中的k个最相似&#xff08;即特征空…...

Transformer 架构 - 编码器 (Transformer Architecture - Encoder)

1.Transformer 编码器整体结构 Transformer 编码器的结构相对直观:它由 N 个完全相同的编码器层 (Encoder Layer) 堆叠而成。 图1: Transformer 编码器整体结构示意图 (简化) 输入序列(例如,通过 embedding 层转换后的词向量)首先会加上位置编码,然后传入第一个编码器层…...

深入理解 Transformer:从原理解析到文本生成实践

学习目标&#xff1a; 完成本教程后&#xff0c;学习者应该能够&#xff1a; 理解 Transformer 架构的核心思想&#xff0c;尤其是自注意力机制 (Self-Attention)。掌握 Transformer 编码器 (Encoder) 和解码器 (Decoder) 的内部结构和工作原理。理解位置编码 (Positional Enc…...

使用MetaGPT 创建智能体(2)多智能体

先给上个文章使用MetaGPT 创建智能体&#xff08;1&#xff09;入门打个补丁&#xff1a; 补丁1&#xff1a; MeteGTP中Role和Action的关联和区别&#xff1f;这是这两天再使用MetaGPT时候心中的疑问&#xff0c;这里做个记录 Role&#xff08;角色&#xff09;和 Action&…...

数据结构学习笔记 :树与二叉树详解

目录 树的基本概念二叉树的定义与特性二叉树的存储结构 3.1 顺序存储 3.2 链式存储二叉树遍历特殊二叉树类型总结与应用场景 一、树的基本概念 核心定义 树&#xff1a;由根节点和若干子树构成的层次结构。叶子节点&#xff08;终端节点&#xff09;&#xff1a;没有子节点的…...

基于大模型的直肠息肉诊疗全流程风险预测与方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理简介 2.2 大模型在医疗领域应用现状 三、直肠息肉术前预测与准备 3.1 基于大模型的术前风险预测 3.1.1 息肉性质预测 3.1.2 手术难度预测 3.2 基于预测结果的术前准备 3.…...

Python作业4 文本词云统计,生成词云

编写程序&#xff0c;统计两会政府工作报告热词频率&#xff0c;并生成词云。 2025两会政府工作报告 import jieba import wordcloud from collections import Counter import re# 读取文件 with open("gov.txt", "r", encoding"gbk") as f:t …...

AI绘制流程图,方法概述

1 deepseek 生成图片的mermaid格式代码&#xff0c;在kimi中进行绘图或在jupter notebook中绘制&#xff1a; 或在draw.io中进行绘制&#xff08;mermaid代码&#xff09; 2 svg是矢量图&#xff0c;可以插入到word """mermaid graph TDA[基线解算] --> B[北…...

Netlink套接字

netlink套接字 Netlink套接字是专门用于用户控件与内核之间的通讯&#xff0c;尤其是监听uevent事件(热插拔&#xff0c;模块加载等)&#xff1b; socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT); AF_NETLINK&#xff1a;Netlink协议族 SOCK_DGRAM…...

settimeout和setinterval区别

1. setTimeout&#xff1a;单次延迟执行 语法&#xff1a; const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能&#xff1a;在指定的 delay&#xff08;毫秒&#xff09;后&#xff0c;执行一次 callback 函数。 参数&#xff1a; callback&#x…...

在排序数组中查找元素的第一个和最后一个位置--LeetCode

题目 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 示例 1&#xff1a; 输入&#xff1a;nums [5,7,7,8,8,10], target 8输出&#x…...

MySQL快速入门篇---库的操作

目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验&#xff08;排序&#xff09;规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 ​…...

rancher 网红无法上传大视频,小于2m可以正常上传

rancher 部署的nginxphp7.4 架构 阿里云oss rancher ingress 本次问题只需要修改php配置即可 nginx 通过映射配置文件直接修改 php 通过添加新的映射文件配置修改 ingress 可以rancher控制台修改yaml 文件 oss 不需要做配置 rootworker3:/data/nfs# sudo cat php/upload.in…...

Linux 文件查找终极指南:find, locate, grep 等命令详解

在 Linux 系统管理和日常使用中,文件查找是一项不可或缺的基本技能。无论是寻找配置文件、查找日志文件中的特定错误,还是清理旧的临时文件,掌握高效的文件查找工具都能让你事半功倍。Linux 提供了多种强大的命令行工具来满足不同的查找需求。本文将详细介绍几个最常用、最强…...

python豆包语音合成并播放

豆包语音合成文档入口&#xff1a;账号登录-火山引擎 #codingutf-8 requires Python 3.6 or later pip install requestsimport base64 import json import requests from playsound import playsoundtts_file_name"doubaotts.mp3" def doubao_tts(text):语音合成ap…...

LoRA(Low - Rank Adaptation,低秩自适应 )微调技术改进创新点

LoRA(Low - Rank Adaptation,低秩自适应 )微调技术改进创新点 模型参数层面 低秩分解创新:LoRA核心是对权重矩阵低秩分解,将原始权重矩阵分解为固定的预训练权重部分和可训练的低秩变化量部分。传统全量微调需更新全部参数,而LoRA只更新低秩矩阵参数,大幅减少可训练参数…...

Shell脚本-变量是什么

在Shell脚本编程中&#xff0c;变量是一个非常基础且重要的概念。它们用于存储数据&#xff0c;并可以在整个脚本中引用这些数据来执行各种操作。理解如何定义、使用和管理变量是编写有效Shell脚本的关键。本文将详细介绍Shell脚本中的变量&#xff0c;包括其基本概念、类型以及…...

空调制冷量和功率有什么关系?

空调的制冷量和功率是衡量空调性能的两个核心参数,二者既有区别又紧密相关,以下是具体解析: 1. 基本定义 制冷量(Cooling Capacity)指空调在单位时间内从室内环境中移除的热量,单位为 瓦特(W) 或 千卡/小时(kcal/h)。它直接反映空调的制冷能力,数值越大,制冷效果越…...

天梯赛树学合集

天梯赛关于树的知识考的还是就比较多的 1.PTA | 程序设计类实验辅助教学平台 #include<bits/stdc.h> using namespace std; int n; int root,a[2000]; int f1,g1; void dfs1(int l,int r){if(f0) return;int bala[l];if(r-l1<2) return;for(int il1;i<r;i){if(a[…...

今日多肽之——订书肽

订书肽是一种具有特殊结构和性质的新型多肽&#xff0c;在科研领域有重要应用&#xff0c;以下是具体介绍&#xff1a; 定义 订书肽是基于多肽形成 α- 螺旋以穿过细胞膜进入细胞的需求发展起来的。2000 年&#xff0c;Verdine 等发展了一种用碳碳键作为支架来稳定多肽 α- 螺…...

SonarQube 集成教程

SonarQube 集成教程 SonarQube&#xff08;原名 Sonar&#xff09; [3] 是由 SonarSource 开发的一个开源平台&#xff0c;使用java开发&#xff0c;用于对代码质量进行持续检查&#xff0c;通过静态分析代码自动进行审查&#xff0c;以检测 29 种编程语言的错误和代码异味。S…...

最优树搜索策略

1. Hill Climbing (爬山算法) 1.1 算法思路 爬山算法是一种简单的局部搜索算法&#xff0c;旨在通过不断选择当前状态的“最优”邻居来寻找全局最优解。该算法的核心思想是通过不断朝着某个方向改进来寻找解&#xff0c;直到没有更好的邻居可选为止。 具体步骤&#xff1a; …...

java基础问题

1. 数组扩充 new ArrayList(20) 扩容问题 这样初始化&#xff0c;没有发生扩容。在使用时若容量不够用了才会发生扩容。 当容量超过20个时会发生1.5倍原容量的扩容 如&#xff1a;容量加到 < 30 个。会扩容到 30 个。 若容量加到 > 30个&#xff0c;如31个&#xff0…...

2025年人工智能指数报告(斯坦福)重点整理

在今天的AI简报中&#xff0c;我将分享斯坦福大学以人为本人工智能研究所&#xff08;HAI&#xff09;于2025年4月7日发布的《2025年AI指数报告》的精彩内容。这是该年度报告的第八版&#xff0c;它提供了全球AI格局的详细信息和分析&#xff0c;包括全球应用、出版物、专利、资…...

驱动移植【简略版】

一、RTC时钟 测试一下看看能不能用就行 二、LED指示灯驱动 1.在设备树找到LED的节点&#xff0c;改对应的引脚&#xff0c; 2.还需要注意引脚的复用引脚有没有被其它东西占用&#xff0c;可以通过NXP官方提供的cofingue tool软件去查看&#xff0c;注释掉就行 三、RJGT102加…...

Qt QTimer 详解与使用指南

Qt QTimer 详解 QTimer 是 Qt 中用于实现定时器功能的类&#xff0c;通过周期性地触发 timeout() 信号来执行任务。以下从核心用法、高级功能、注意事项及示例代码等方面进行详细解析。 1. 基本用法 步骤&#xff1a; 创建对象&#xff1a;实例化 QTimer&#xff0c;通常指定…...

PDK中technology file从tf格式转换为lef格式

在数字后端流程中需要导入technology file工艺文件&#xff0c;一般传统的PDK中都提供.tf形式&#xff0c;能够在Synopsys ICC中进行导入。但是由于Cadence Innovus不断地完善&#xff0c;更多的工程采用了其进行数字后端设计。不过Cadence Innovus导入的是.lef格式的工艺文件&…...

Spring Boot资源耗尽问题排查与优化

Spring Boot服务运行一段时间后新请求无法处理的问题。服务没有挂掉&#xff0c;也没有异常日志。思考可能是一些资源耗尽或阻塞的问题。 思考分析 首先&#xff0c;资源耗尽可能涉及线程池、数据库连接、内存、文件句柄或网络连接等。常见的如线程池配置不当&#xff0c;导致…...

图+文+语音一体化:多模态合成数据集构建的实战与方法论

目录 图文语音一体化&#xff1a;多模态合成数据集构建的实战与方法论 一、多模态合成数据的核心价值 二、系统架构概览 三、核心模块与实现建议 ✅ 1. 文→图&#xff1a;图像合成&#xff08;Text-to-Image&#xff09; ✅ 2. 图→文&#xff1a;自动描述&#xff08;I…...

java的lambda和stream流操作

Lambda 表达式 ≈ 匿名函数 &#xff08;Lambda接口&#xff09;函数式接口&#xff1a;传入Lambda表达作为函数式接口的参数 函数式接口 只能有一个抽象方法的接口 Lambda 表达式必须赋值给一个函数式接口&#xff0c;比如 Java 8 自带的&#xff1a; 接口名 作用 Functio…...

Excalidraw:一个免费开源的白板绘图工具

Excalidraw 是一款免费开源的白板绘图工具&#xff0c;主打手绘风格&#xff0c;界面简洁易用&#xff0c;支持实时协作。它常用于绘制技术架构图、流程图、线框图、思维导图等&#xff0c;尤其适合需要快速草图设计的场景。 Excalidraw 支持的主要功能如下&#xff1a; &…...

推荐一款Umi-OCR_文字识别工具

Umi-OCR_文字识别工具 https://github.com/hiroi-sora/Umi-OCR/releases/latest...