c++进阶之----智能指针
1.概念
在 C++ 中,智能指针是一种特殊的指针类型,它封装了裸指针(raw pointer)的行为,并通过 RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制自动管理动态分配的内存。智能指针的主要目的是简化内存管理,避免内存泄漏、悬空指针等问题。
2.执行机制
3.实现代码
实现过程就是前面类和对象的内容,只不过将其与异常处理杂糅起来了,具体细节见代码注释!
#include <iostream>
#include<functional>
using namespace std;
template <class T>
class SmartPtr
{
public://RAIISmartPtr(T* ptr):_ptr(ptr){}~SmartPtr(){cout << "delete[] " << _ptr << endl;delete[] _ptr;}// 重载运算符,模拟指针的行为,方便访问资源T& operator*(){return *_ptr;}T* operator->(){return _ptr;}T& operator[](size_t i){return _ptr[i];}
private:T* _ptr;
};double Divide(int a, int b)
{// 当b == 0时抛出异常if (b == 0){throw "Divide by zero condition!";}else{return (double)a / (double)b;}
}void func()
{// 这里使用RAII的智能指针类管理new出来的数组以后,程序简单多了SmartPtr<int> sp1 = new int[10];SmartPtr<int> sp2 = new int[10];//SmartPtr<int> sp3(sp1); //通过sp1构造sp3 // 默认的拷贝构造函数和赋值运算符会进行浅拷贝,这会导致多个 SmartPtr 对象指向同一个资源。// 当这些对象被销毁时,多个析构函数会尝试释放同一个指针,导致未定义行为(通常是程序崩溃)。//所以记得把他注释掉,只是说可能怎么写,但是超级不建议for (size_t i = 0; i < 10; i++){sp1[i] = sp2[i] = i;}int len, time;cin >> len >> time;cout << Divide(len, time) << endl;
}int main()
{try{func();}catch (const char* errmsg){cout << errmsg << endl;}catch (const exception& e){cout << e.what() << endl;}catch (...){cout << "未知异常" << endl;}return 0;
}
对比一下运行结果:
这是调试时的界面,抛出的异常会被这个catch捕捉
4.智能指针的种类
C++ 标准库提供了几种常见的智能指针类型:
4.0 std::auto_ptr
4.1 std::unique_ptr
std::unique_ptr
是一种独占所有权的智能指针,表示它所指向的资源只能被一个 unique_ptr
对象拥有。当 unique_ptr
被销毁时,它会自动释放所管理的资源。
-
特点:
-
不可复制(copy),但可以移动(move)。
-
适合单所有权场景。
-
性能开销极小,几乎和裸指针相当。
-
4.2 std::shared_ptr
std::shared_ptr
是一种引用计数的智能指针,允许多个 shared_ptr
对象共享对同一资源的所有权。当最后一个 shared_ptr
被销毁时,资源会被自动释放。
-
特点:
-
支持复制(copy)。
-
支持移动(move)
-
适合共享所有权场景。
-
性能开销稍高,因为需要维护引用计数(底层实现)。
-
4.3 std::weak_ptr
std::weak_ptr
是一种弱引用指针,通常与 std::shared_ptr
一起使用。它观察一个资源,但不增加引用计数。weak_ptr
主要用于打破 shared_ptr
的循环引用问题。
-
特点:
-
不增加引用计数。
-
适合观察资源,但不希望影响资源的生命周期。
-
4.4 代码示例
我们先实现一个日期类
struct Date
{int _year;int _month;int _day;Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}~Date(){cout << "~Date()" << endl;}
};
4.4.1 auto_ptr
int main()
{//创建一个 auto_ptr<Date> 对象 ap1,它管理一个动态分配的 Date 对象auto_ptr<Date> ap1(new Date);// 拷贝时,管理权限转移,被拷贝对象ap1悬空//在 auto_ptr 的拷贝构造中,ap1 的所有权会被转移到 ap2,ap1 会变成一个悬空指针(即它不再管理任何资源)。auto_ptr<Date> ap2(ap1);//尝试通过 ap1 访问资源,但此时 ap1 已经是一个悬空指针,导致未定义行为(通常是程序崩溃或异常)ap1->_year++;return 0;
}
运行上述代码,触发报错:
4.4.2 unique_ptr
int main()
{unique_ptr<Date> up1 (new Date);// 不支持拷贝//unique_ptr<Date> up2(up1);// 支持移动,但是移动后up1也悬空,所以使用移动要谨慎unique_ptr<Date> up3(move(up1));return 0;
}
运行代码:触发报错
4.4.3 shared_ptr
int main()
{shared_ptr<Date> sp1(new Date);// 支持拷贝shared_ptr<Date> sp2(sp1);shared_ptr<Date> sp3(sp2);//use_count() 返回一个整数值,表示当前资源的引用次数。cout << sp1.use_count() << endl;sp1->_year++;cout << sp1->_year << endl;cout << sp2->_year << endl;cout << sp3->_year << endl;return 0;
}
运行一下:
说明:
在 shared_ptr
的引用计数机制中,析构函数的调用次数与引用计数无关,只与资源是否被释放有关。当引用计数变为0时,资源被释放,析构函数被调用一次。因此,即使引用计数为3,析构函数也只会调用一次。
4.4.4 weak_ptr
这里我们要了解三个函数:
-
expired()
:检查资源是否已过期。 -
use_count()
:返回共享该资源的shared_ptr
对象的数量。 -
lock()
:获取一个shared_ptr
对象,如果资源未过期。
int main()
{shared_ptr<string> sp1(new string("11111111"));shared_ptr<string> sp2(sp1);// sp2与 sp1 共享同一个资源weak_ptr<string> wp = sp1; //wp指向 sp1 的资源cout << wp.expired() << endl; // 检查 wp 是否过期,输出 0(false),表示资源未过期cout << wp.use_count() << endl; // 输出 2,表示 sp1 和 sp2 共享资源// sp1和sp2都指向了其他资源,则weak_ptr就过期了sp1 = make_shared<string>("222222");cout << wp.expired() << endl;// 输出 1(true),表示资源已过期cout << wp.use_count() << endl;// 输出 0,表示没有 shared_ptr 共享资源sp2 = make_shared<string>("333333");cout << wp.expired() << endl; //同上cout << wp.use_count() << endl;wp = sp1;auto sp3 = wp.lock(); // 使用 wp.lock() 获取一个 shared_ptr 对象cout << wp.expired() << endl; // 输出 0(false),表示资源未过期cout << wp.use_count() << endl; // 输出 2,表示 sp1 和 sp3 共享资源*sp3 += "###";cout << *sp1 << endl;sp1 = sp2;return 0;
}
5. 手撕智能指针
由于我们要模拟引用计数,这里我们引入c++11的atomic,具体来说是atomic<int>
,是 C++11 中引入的一个模板类,用于支持原子操作。它确保对整数的操作是线程安全的,可以避免在多线程环境下出现数据竞争问题。 通常用于需要在多线程环境中进行原子操作的场景,比如计数器、标志位等。通过使用 atomic<int>
,可以确保对变量的读取和写入操作是原子的,从而避免竞态条件
namespace rens
{template<class T>class my_shared_ptr{public://在 C++ 中,explicit 是一个关键字,用于修饰构造函数,表示该构造函数只能通过直接初始化的方式调用,而不能通过隐式转换的方式调用。explicit 的主要目的是防止意外的隐式类型转换,从而提高代码的安全性和可读性。explicit my_shared_ptr(T* ptr = nullptr):_ptr(ptr),_pcount(new std::atomic<int>(1)){}// 定制删除器,面试时手撕时,不要写删除器部分template<class D>my_shared_ptr(T* ptr, D del): _ptr(ptr), _pcount(new std::atomic<int>(1)), _del(del){}//当一个 my_shared_ptr 对象被赋值为另一个对象时,先释放当前资源,// 然后复制新对象的资源,并增加引用计数。my_shared_ptr(const my_shared_ptr<T>& sp):_ptr(sp._ptr), _pcount(sp._pcount){++(*_pcount);}void release(){//如果引用计数为0,则释放资源。if (--(*_pcount) == 0){//delete _ptr;_del(_ptr);// 定制删除器delete _pcount;}}// sp1 = sp3my_shared_ptr<T>& operator=(const my_shared_ptr<T>& sp){if (_ptr != sp._ptr){release();_ptr = sp._ptr;_pcount = sp._pcount;++(*_pcount);}return *this;}~my_shared_ptr(){release();}// 像指针一样使用T& operator*(){return *_ptr;}T* operator->(){return _ptr;}int use_count() const{return *_pcount;}T* get() const{return _ptr;}private:T* _ptr;atomic<int>* _pcount;function<void(T*)> _del = [](T* ptr) {delete ptr; };};template<class T>class my_weak_ptr{public:my_weak_ptr(){}my_weak_ptr(const my_shared_ptr<T>& sp):_ptr(sp.get){}my_weak_ptr<T>& operator=(const shared_ptr<T>& sp){_ptr = sp.get();return *this;}private:T* _ptr = nullptr;};
}int main()
{rens::my_shared_ptr<Date> sp1(new Date);rens::my_shared_ptr<Date> sp2(sp1);rens::my_shared_ptr<Date> sp3(new Date);sp1 = sp1;sp1 = sp2;sp1 = sp3;sp2 = sp3;return 0;
}
补充:带删除器版本附加
template<class T>
void DeleteArrayFunc(T* ptr)
{delete[] ptr;
}
template<class T>
class DeleteArray
{
public:void operator()(T* ptr){delete[] ptr;}
};class Fclose
{
public:void operator()(FILE* ptr){cout << "fclose:" << ptr << endl;fclose(ptr);}
};
int main()
{/*std::shared_ptr<Date[]> sp1(new Date[10]);std::unique_ptr<Date[]> up1(new Date[10]);*/// 定制删除器 函数指针/仿函数/lambdarens::my_shared_ptr<Date> sp2(new Date[5], DeleteArray<Date>());rens::my_shared_ptr<Date> sp3(new Date[5], DeleteArrayFunc<Date>);auto delArrOBJ = [](Date* ptr) {delete[] ptr; };rens::my_shared_ptr<Date> sp4(new Date[5], delArrOBJ);// 实现其他资源管理的删除器rens::my_shared_ptr<FILE> sp5(fopen("Test.cpp", "r"), Fclose());rens::my_shared_ptr<FILE> sp6(fopen("Test.cpp", "r"), [](FILE* ptr) {cout << "fclose:" << ptr << endl;fclose(ptr);});rens::my_shared_ptr<Date> sp7(new Date);//unique_ptr<Date, DeleteArray<Date>> up2(new Date[5]);//unique_ptr<Date, void(*)(Date*)> up3(new Date[5], DeleteArrayFunc<Date>);decltype对象的类型//unique_ptr<Date, decltype(delArrOBJ)> up4(new Date[5], delArrOBJ);return 0;
}
6.内存泄漏
6.1 定义
内存泄漏是指程序在申请内存后,无法释放已申请的内存,导致可使用的内存越来越少。随着时间的推移,内存泄漏会导致系统性能下降,甚至可能导致程序崩溃或系统不稳定。
6.2 内存泄漏的危害
6.2.1 系统性能下降:
内存泄漏会导致可用内存逐渐减少,系统需要频繁地进行内存交换(swap),从而增加磁盘I/O操作,降低系统响应速度。随着时间的推移,系统可能会变得越来越慢,最终可能导致系统崩溃。
6.2.2 程序崩溃:
当内存泄漏严重时,系统可能无法为其他程序或进程分配足够的内存,导致程序崩溃或无法启动。在多线程环境中,内存泄漏可能导致线程无法正常运行,从而影响整个程序的稳定性。
6.2.3 资源浪费:
内存泄漏会导致系统资源的浪费,因为已分配的内存无法被其他程序或进程使用。长期的内存泄漏会导致系统资源的严重浪费,影响系统的整体性能。
6.2.4 安全性问题:
在某些情况下,内存泄漏可能导致敏感数据(如密码、密钥等)驻留在内存中,增加数据泄露的风险。内存泄漏可能导致系统不稳定,从而影响系统的安全性。
6.3 内存泄漏的常见原因
-
未释放的动态内存:在 C 和 C++ 中,使用
malloc
或new
分配的内存如果没有对应的free
或delete
,就会导致内存泄漏。 -
循环引用:在使用引用计数的智能指针(如
std::shared_ptr
)时,如果两个对象互相引用,可能会导致引用计数无法减到零,从而引发内存泄漏。 -
全局变量和静态变量:全局变量和静态变量在程序结束时才会被释放,如果程序运行时间较长,可能会导致内存泄漏。
-
异常处理不当:在异常处理中,如果未正确释放资源,可能会导致内存泄漏。
6.4 如何避免内存泄漏
-
使用智能指针:在 C++ 中,使用
std::unique_ptr
和std::shared_ptr
等智能指针可以自动管理内存,避免手动释放内存。 -
代码审查:定期进行代码审查,检查是否有未释放的内存。
-
使用内存检测工具:使用内存检测工具(如 Valgrind、LeakSanitizer 等)可以帮助发现内存泄漏问题。
-
避免循环引用:在使用引用计数的智能指针时,避免循环引用,可以使用
std::weak_ptr
来打破循环引用。 -
良好的编程习惯:
-
确保每个
malloc
或new
都有对应的free
或delete
。 -
在异常处理中,确保资源被正确释放。
-
到此,我们c++主线课程内容结束!后续可能会更新c++ 副线内容,下一阶段将主要是linux以及算法课博客的更新!
相关文章:
c++进阶之----智能指针
1.概念 在 C 中,智能指针是一种特殊的指针类型,它封装了裸指针(raw pointer)的行为,并通过 RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制自动管理动态分配的…...
08-JVM 面试题-mk
1.JVM 的各部分组成 知道JVM 的好处:知道java 运行机制,排查问题的能力增加,比如内存泄漏、CPU飙高 JVM 是什么:Java Virtual Machine缩写,Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收机制从图中可以看出 JVM …...
MTK7628基于原厂的mtk-openwrt-sdk-20160324-8f8e4f1e.tar.bz2 源代码包,配置成单网口模式的方法
一、配置. 在SDK工程下,运行make kernel_menuconfig,如下图所示: Ralink Module --->选上“One Port Only”,如下图所示: 如果P0网口实现WAN口,就配置成W/LLLL,否则就配置成LLLL/W. 二、修改网口的原代…...
青少年编程与数学 02-016 Python数据结构与算法 15课题、字符串匹配
青少年编程与数学 02-016 Python数据结构与算法 15课题、字符串匹配 一、字符串匹配问题的基本概念(一)定义(二)术语 二、暴力匹配算法(Naive String Matching)(一)算法逻辑…...
基础层数据从kafka读取写入hbase的优化方案
背景: 上游kafka的topic只有一个分区,所以spark在消费的时候,无论设置的executor数有多少,最终只有一个executor在执行,如果不指定executor num的话,默认是开启两个executor,有一个executor的资源是浪费的,例如下面显示的情况,其实只有一个executor是active的状态. 在消费的时…...
thingsboard3.9.1编译问题处理
问题1: [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke failed: Plugin org.thingsboard:gradle-maven-plugin:1.…...
Adobe Photoshop 2025 Mac中文 Ps图像编辑
Adobe Photoshop 2025 Mac中文 Ps图像编辑 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像生成等功能,用户能够快速而精确地编辑图像。②3D编辑和动画功…...
什么是VLA
视觉-语言-动作(VLA)技术综述:迈向具身智能的未来 1. 引言 随着人工智能从单一模态感知迈向多模态交互,视觉-语言-动作(Vision-Language-Action, VLA) 技术逐渐成为连接感知、推理与物理行动的核心桥梁。V…...
数据结构:C语言版严蔚敏和解析介绍,附pdf
《数据结构:C语言版(第2版)》严蔚敏李冬梅吴伟民.pdf 《数据结构:C语言版》严蔚敏,李冬梅.pdf 《数据结构C语言第2版习题解析与实验指导》李冬梅.pdf 「《数据结构:C语言版(第2版 )》…...
C++线段树详解与实现技巧
📚 C++线段树详解与实现技巧 线段树(Segment Tree)是一种高效处理 区间查询 和 区间更新 的数据结构,时间复杂度为 O(log n)。本文结合代码实例,详解其核心原理与实现细节。 🌳 线段树结构特点 完全二叉树:使用数组存储,父子节点关系通过下标计算。区间划分:每个节…...
202527 | RabbitMQ-基础 | 队列 | Direct + Fanout + Topic 交换机 | 消息转换器
RabbitMQ RabbitMQ 架构与核心概念详解 一、整体架构图 #mermaid-svg-UTlKmvHL7RNWK6vu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UTlKmvHL7RNWK6vu .error-icon{fill:#552222;}#mermaid-svg-UTlKmvHL7RNWK6v…...
【学习笔记】服务器上使用 nbconvert 将 Jupyter Notebook 转换为 PDF
1. 环境准备:安装必要工具 在服务器终端运行以下命令,确保依赖已安装: (1) 安装 nbconvert 和 pandoc pip install nbconvert pandoc (2) 安装 LaTeX(推荐 TeX Live) # Ubuntu/Debian sudo apt-get update sudo a…...
List、Set集合通过Stream流求和
目录 一、泛型为Integer、Long、Double、BigDecimal求和 二、泛型为实体类 对单个属性求和 对多个属性分别分组求和 并返回聚合后的对象 多字段乘积求和(基本数据类型) 多字段乘积求和(BigDecimal) 对对象中的多个字段求和…...
微软VSCode 能否击败 Cursor 和 Windsurf?
微软是否能利用平台优势和许可限制来阻止竞争对手? AI 代码编辑器之战加剧 蓬勃发展的 AI 代码编辑领域竞争日益激烈,这个最具变革性和盈利性的新技术领域正在适应相互间的竞争。Visual Studio Code 目前是最主导的代码编辑器。 “根据 Stack Overflow 调查,Visual Studi…...
VSCode会击败Cursor和Windsurf吗?
VSCode 会击败 Cursor 和 Windsurf 吗?微软能不能靠自己的地盘优势和规则限制打压对手?答案是"能",但他们真的会这么干吗? Cursor & Windsurf vs VSCode Copilot 大PKAI编程工具大战越来越激烈现在最火最赚钱的AI…...
机器学习(4)—— K近邻算法
文章目录 1. K近邻算法(K-Nearest Neighbors, KNN)原理1.1. K近邻算法是什么算法?1.2. 核心思想 2. K近邻算法的步骤2.1. 选择K值2.2. 计算距离2.3. 选择最近邻:2.4. 做出预测: 3. K值的选择4. 数据标准化5. 优缺点6. …...
深入解读 React 纯组件(PureComponent)
什么是纯组件? React 的纯组件(PureComponent)是 React.Component 的一个变体,它通过浅比较(shallow comparison)props 和 state 来自动实现 shouldComponentUpdate() 方法,从而优化性能。 核心特点 1. 自动浅比较: PureCompon…...
常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ
常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点: Redis Pub/Sub 适合简单实时消息,但不持久化,消息可能丢失。Redis Stream 提供持久化,适合需要消息历史的场景,但…...
202528 | RabbitMQ-高级 | 消息可靠性 | 业务幂等性 | 延迟消息
消息可靠性 RabbitMQ发送者可靠性 一、发送者重连机制 #mermaid-svg-gqr6Yr5UNZX87ZDU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gqr6Yr5UNZX87ZDU .error-icon{fill:#552222;}#mermaid-svg-gqr6Yr5UNZX87ZD…...
Java EE期末总结(第六章)
一、IoC 1、Bean装配流程 IOC装配流程在代码中的对应就体现在Service这个注解 依赖注入在代码中体现在 ,比如 Resource UserService userService 二、AOP 简化流程,为程序员简便操作 tmd编不下去了我自己看视频都没理解md不弄了; 给两个…...
ASP.NET Core 性能优化:内存缓存
文章目录 前言一、什么是缓存二、内存缓存三、使用内存缓存1)注册内存缓存服务2)注入与基本使用3)高级用法GetOrCreate(避免缓存穿透)异步方法:GetOrCreateAsync(避免缓存穿透)两种过…...
Go小技巧易错点100例(二十六)
本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…...
《算法笔记》3.5小节——入门模拟->进制转换
1022 D进制的AB #include <iostream> using namespace std; int maxn32;int main() {int z[maxn],num0,a,b,d;cin>>a>>b>>d;int resab;do{z[num]res%d;resres/d;}while(res);for (int i num-1; i >0 ; i--) {cout<<z[i];}return 0; }问题 A:…...
【MQTT-协议原理】
MQTT-协议原理 ■ MQTT-协议原理■ MQTT-服务器 称为"消息代理"(Broker)■ MQTT协议中的订阅、主题、会话■ 一、订阅(Subscription)■ 二、会话(Session)■ 三、主题名(Topic Name&a…...
JWT认证服务与授权 .netCore
1.实现流程图 2.认证信息概述 Header:System.IdentityModel.Tokens.Jwt.JwtHeader Payload: System.IdentityModel.Tokens.Jwt.JwtPayload Issuer: http://localhost:7200 Audience: http://localhost:7200 Expiration: 2025/4/11 15:06:14 Claim - Type: http://schemas…...
编译原理 实验二 词法分析程序自动生成工具实验
文章目录 实验环境的准备实验实验预备知识分析案例所要做的任务实战 实验环境的准备 安装flex 安装MinGW MinGW Installation Manager页面 apply changes 下载比较耗时 只看到了一个文件,复制过去 配置环境变量 使用gcc -v检验是否安装完成 实验 实验预备知识…...
【C++初学】课后作业汇总复习(一)概述、输入输出、类的入门——理解封装
一、概述、输入输出、类的入门——理解封装 - 1. ab input two number output sum of a and b; #include <iostream>using namespace std;int main() {int a 0;int b 0;cin >> a >> b;cout << ab <<endl;return 0; }2.输入1~7任意一个整数&…...
数学建模:针对汽车行驶工况构建思路的延伸应用
前言: 汽车行驶工况构建的思简单理解为将采集的大量数据进行“去除干扰、数据处理,缩减至1800S的数据”,并可达到等效替换的目的,可以使在试验室快速复现;相应的解决思路、办法可应用在 “通过能量流采集设备大量采集…...
Qt 之opengl shader language
着色器示例代码 实际运行效果...
dolphinscheduler创建文件夹显示存储未启用的问题--已解决
只要修改api-server/comf/common.properties和standalone-server/conf/common.properties里面的内容就可以了,应为你要靠standalone-server这个服务启动dolphinscheduler-web,其他就算怎么改你重启dolphinscheduler的时候系统也不会识别新的common.prope…...
解密 Linux 线程:多线程编程与资源管理
个人主页:chian-ocean 文章专栏-Linux 前言: 在Linux中,线程 是一种轻量级的执行单元,它是进程的一部分。多个线程可以在同一个进程内并行执行任务,通常它们共享该进程的资源,如内存空间、文件描述符等。…...
Node.js net模块详解
Node.js 的 net 模块提供了基于 TCP 或 IPC 的网络通信能力,用于创建服务器和客户端。以下是 net 模块的核心 API 详解,包含类、方法、事件及示例。 1. 模块引入 const net require(net);2. 核心类与方法 2.1 net.Server 类 用于创建 TCP 或 IPC 服务…...
Node.js中fs模块详解
Node.js 中 fs 模块(非 Promise)API 详解 Node.js 的 fs 模块提供了同步和异步的文件系统操作。以下是非 Promise 版本的 API 详解: 1. 文件读取操作 const fs require(fs);// 异步读取文件 fs.readFile(file.txt, utf8, (err, data) >…...
Mouse without Borders – 用一套鼠标 / 键盘控制四台电脑
同时操控 2 台电脑,只需一个鼠标和键盘!完全免费,由微软官方提供 | 零度解说_哔哩哔哩_bilibili Mouse Without Borders 简介 Mouse Without Borders(无界鼠标)是由微软开发的免费键鼠共享工具,支持在局…...
《车辆人机工程-汽车驾驶操纵实验》
汽车操纵装置有哪几种,各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件,主要包括以下几种,其特点如下: 一、方向盘(转向操纵装置) 作用:控制车辆行驶方向,通过转…...
使用DaemonSet部署集群守护进程集
使用DaemonSet部署集群守护进程集 文章目录 使用DaemonSet部署集群守护进程集[toc]一、使用DaemonSet部署日志收集守护进程集二、管理DaemonSet部署的集群守护进程集1.对DaemonSet执行滚动更新操作2.对DaemonSet执行回滚操作3.删除DaemonSet 一、使用DaemonSet部署日志收集守护…...
破解升腾c10,改造成下载机(第二篇:获取xterm终端)
当c10刷好华为ct3100系统后,就开始获取xterm终端,然后再安装entware. 第一步:获取xterm终端。 点击桌面左下角的工具图标 再点browser 输入百度网址,访问! 然后再将网页另存为~~~…...
浏览器多开
使用浏览器的用户功能,创建多个用户即可完成浏览器多开的需求,插件等相对独立 需要命名 然后就可以通过多个用户切换来实现多开了,不同任务选择不同用户...
使用Python实现的音符生成和节拍器程序
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **摘要****先决条件****设置**生成音符频率播放音符节拍器合并结论摘要 节拍器和随机音符生成器各有用途,但单独使用时功能有限。本…...
【生活相关-日语-日本-东京-留学生-搬家后或新入驻-水道局申请饮用水(1)-办理手续】
【生活相关-日语-日本-东京-搬家后-水道局申请饮用水-办理手续】 1、前言2、情况说明(1)他人代办(2)打电话(3)网络申请(4)你将会面临什么,主要步骤(5…...
PyTorch模型构造实战:从基础到复杂组合
本文通过多个示例演示如何使用PyTorch构建不同类型的神经网络模型,涵盖基础多层感知机、自定义块、顺序块以及复杂组合模型。所有代码均附带输出结果,帮助读者直观理解模型结构。 1. 多层感知机(MLP) 使用nn.Sequential快速构建一…...
【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
一、铺垫 在当今的软件开发领域,消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能,从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库,不仅提供了丰富的数据结构,…...
并发编程--互斥锁与读写锁
并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念: 互斥指的是控制两个进度使之互相排斥&#x…...
Linux下Docker安装超详细教程(以CentOS为例)
前言 Docker 已成为现代应用开发和部署的标配工具。本教程将手把手教你 在 CentOS 系统上安装 Docker,涵盖从环境准备到验证安装的全流程,并解决常见问题。无论你是运维工程师还是开发者,均可快速上手。 一、环境要求 操作系统 CentOS 7 或更…...
Ubuntu 服务器版本 设置socket服务(Python)
1. 确定 Socket 类型 Socket 服务可以是: 网络 Socket:基于 TCP/UDP 协议(如 Web 服务器、API 服务)。 Unix Domain Socket:本地进程间通信(如 Docker、MySQL 默认使用)。 2. 编写一个简单的 Socket 服务示例(Python) 以 Python 为例,创建一个 TCP Socket 服务:…...
对于GAI虚假信息对舆论观察分析
摘要 生成式人工智能(Generative Artificial Intelligence, GAI)的技术革新重构了信息生产机制,但也加剧了虚假信息对舆论生态的异化风险。 关键词:生成式人工智能、虚假信息、舆论异化、智能治理 一、生成式人工智能虚假信息下…...
HTTP:三.HTTP连接
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是互联网上最常用的协议,用于在客户端和服务器之间传输数据。HTTP协议通常用于从Web服务器传输网页和文件到客户端浏览器,并支持其他用途,如传输API数据和传输文件。 HTTP连接是指客户端向服务…...
hyper-v server服务器部署远程访问(我目前环境:hyper-v服务器+路由器+公网ip)
Hyper-v server部署(裸金属方式) 系统镜像下载安装# 下载地址:17763.737.190906-2324.rs5_release_svc_refresh_SERVERHYPERCORE_OEM_x64FRE_zh-cn_1.iso 安装的过程很简单,和安装Windows操作系统没啥区别,这里就不记录了。 安装过程可参考:安装Hyper-v Server 2016 部…...
MCP遇见Web3:从边缘计算到去中心化的无限想象
MCP遇见Web3:从边缘计算到去中心化的无限想象 在数字化转型的浪潮中,边缘计算(MCP,Micro Control Protocol)和Web3技术分别在计算效率与去中心化架构上发挥着各自的优势。当两者融合,会碰撞出哪些火花?作为一名技术极客,我最近开始深度研究MCP与Web3工具的集成,试图探…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十三) -> ArkTS/TS代码重构
目录 1 -> Refactor-Extract代码提取 2 -> Refactor-Convert代码转换 3 -> Refactor-Rename代码重命名 4 -> Move File 5 -> Safe Delete 1 -> Refactor-Extract代码提取 在编辑器中支持将函数内、类方法内等区域代码块或表达式,提取为新方…...