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

跟我学c++中级篇——动态库的资源处理

一、动态库的资源管理

动态库在编程中几乎是一个无法绕过的问题,不管是在哪个平台上都一样。在前面的文章中分析知道,编程的一个核心目标就是对计算机的资源进行管理和控制。动态库编程做为一个重要的技术,同样要面对资源的管理这个重要问题。
资源管理,说的直白一些,就是对资源的分配、应用和回收。而常见的资源包括:变量、内存、IO及其它一切与编程相关的计算机资源(如GDI相关的句柄等)。

二、变量的管理

变量,开发者都知道,但对动态库来说,普通的变量一般来说和正常程序中的应用上没有什么特别之处。但在动态库中,静态和全局变量以及对外开放的指针变量才是与普通应用中的不同之处。下面说明一下:
1、指针变量
指针变量其实就是内存的管理,而动态库和外部应用如果有指针就交互就会出现一个问题,到底谁来分配、释放和如何控制在不同位置的应用。特别是如果出现多线程的应用,就更可能出现不可预料的问题。而如果分配与释放出现了多方面的管理,极容易出现崩溃的情况。
所以在前面的分析中,反复强调要将内存的管理各自管理自己的而不能出现交互管理的情况。有可能的情况还是推荐使用智能指针。
2、静态变量
静态变量在动态库中的应用也是一个重点,特别是有用到静态指针变量的情况下。除了静态变量的生命周期很长,会出现在不同位置及不同线程上应用的复杂性,重点在于指针的到处乱飞有可能引起异常导致整个程序的崩溃。还有一个重要的情况,就是前面分析过的,如果静态变量的应用有依赖顺序的情况,就会出现不可预料的问题也就是UB问题。
3、全局变量
全局变量与静态变量有些类似,除了上面的情况外,还有可能出现动态库中的全局变量如何使用智能指针,可能会出现的二次释放的问题。这些都在前面分析过,此处不再赘述。

三、资源的处理

除了上面的变量外,资源处理在动态库中也是一个很重要的方面。而在资源方面上,最主要的就是内存,当然也包括IO、CPU以及各种抽象的相关资源等。
1、内存
内存资源的处理,对动态库来说,是一个非常重要的问题。这个反复分析过,原理就一个:“各人自扫门雪,不管他人瓦上霜”。一个重要的就是要使用好RAII。
2、IO
IO资源的控制,在动态库中来说,重点是合理的分配、管理。也就是说,要明确IO资源的所有权以及这种IO资源的控制顺序(其实就是生命周期的控制),防止出现各种异常情况。即资源的分配和回收也要做谁分配谁回收。
3、CPU
对CPU来说,其实就是对多线程和锁等资源的控制。重点就是锁的生命周期的正确管控,防止出现死锁以及资源泄露等情况。
4、异常的资源管理
其实在程序开发中,异常的管控也相当重要。虽然说在C/C++中不推荐使用异常。但这里的异常不只包括Exception也包括各种错误的场景,说得直白一些,就是在异常出现的情况下,如何才能正确的进行资源的清理和回收。
5、其它相关资源
其它的一些相关资源也不少,包括GDI句柄、其它一些硬件资源等。其实重点就在于资源的安全管理。

正如前面所述,所谓资源的管理,一个最根本的核心原因是资源的稀缺性。即使计算机技术发展到现在,计算机资源仍然处于一个紧张状态。如果计算机资源非常多,资源管理的意义就不大了。

四、动态库中的一些特别处理

在计算机中,不光有一些资源的处理,还有一些与资源控制相关的操作,主要有:
1、资源的分配、初始化和回收
资源的生命周期的管理,在动态库中非常关键。特别是初始化,由于动态库和上层应用有可能共享资源,而初始化的时间窗口不正确的情况下,极有可能出现各种异常情况。
2、设计模式
在动态库中应用设计模式时,除了要考虑好整体的生命周期的匹配外,还需要注意如果出现库与应用交互的情况需要处理好各种状态和相关的应用顺序等。设计模式是这种场景的典型应用。
3、事件和消息
动态库与调用者的交互其实也非常重要,一般情况下,交互的过程通过事件与消息的场景比较多。这里面一个重要的环节在于要保证事件和消息传递的安全性和稳定性。比如在UI编程中,使用Qt发送消息到动态库中时,要保证相关的变量仍然存在。

五、总结

动态库中的资源管理只是动态库编程的重点之一。由于动态库的动态加载的情况,就导致了其对资源的管理出现了一些特殊的情况(加载的时间点、内存的位置等等)。如果不能正确的处理这种特殊情况,就有可能出现库本身或程序的崩溃。
故而,认真的掌握动态库的基本原理和应用情况才能更好的扬长避短,发挥动态库的优势,防止一些意外的情况的出现。

相关文章:

跟我学c++中级篇——动态库的资源处理

一、动态库的资源管理 动态库在编程中几乎是一个无法绕过的问题,不管是在哪个平台上都一样。在前面的文章中分析知道,编程的一个核心目标就是对计算机的资源进行管理和控制。动态库编程做为一个重要的技术,同样要面对资源的管理这个重要问题…...

新能源集群划分+电压调节!基于分布式能源集群划分的电压调节策略!

适用平台:MatlabYalmip Cplex (具体操作已在程序文件中说明) 参考文献:基于分布式能源集群化分的电压调节策略[D]. 一、文献解读 1. 主要内容/创新点 提出了一种基于分布式能源集群化的电压调节策略,计及分布式能源的有功、无功调节能力&a…...

端午安康 | 以匠心,致长远

端午节快乐 值此端午佳节,数图衷心感谢每一位合作伙伴与客户的信任相伴。 我们专注每一处细节,如粽米般紧密凝聚; 我们携手共进共赢,似龙舟竞渡般齐心协力。 未来,我们愿继续以创新为桨,与您共划时代新篇…...

漫画Android:事件分发的过程是怎样的?

当用户触摸屏幕时,硬件层会捕获触摸信号,并将其转化为内核事件。 Android系统会通过InputManagerService和WindowManagerService等服务将这些事件包装成MotionEvent对象,并将其传递给Activity的dispatchTouchEvent()方法中,Activi…...

2022 RoboCom 世界机器人开发者大赛-本科组(省赛)解题报告 | 珂学家

前言 题解 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)。 感觉T5是最简单的,其他都不好做。 RC-u5 树与二分图 分值: 30分 思路: 容斥原理 树天然就是二分图,按深度d归类(偶数深度为S1,奇数深度为S2)&#x…...

什么是MCP技术,跟http技术有什么区别

什么是MCP技术? MCP(Model Context Protocol,模型上下文协议)是一种开源协议,旨在标准化大型语言模型(LLM)与外部数据源和工具之间的集成方式。 核心功能 上下文管理:保存对话历史…...

如何用ChatGPT提升学术长文质量

目录 一、关于让人工智能充当评审专家 二、关于分批次输入论文内容 三、来看看提示词 大家好这里是学术Anan,官网👉AIWritePaper~ 论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易…...

BKP(备份寄存器)和 RTC(实时时钟)

什么是BKP? 备份寄存器(BackupRegister)是42个16位的寄存器(不同设备存在差异:20字节(中容量和小容量)/84字节(大容量和互联型)),可用来存储 最多…...

springboot配置cors拦截器与cors解释

文章目录 cors?代码 cors? CORS(跨域资源共享)的核心机制是 由后端服务器(bbb.com)决定是否允许前端(aaa.com)的跨域请求 当浏览器访问 aaa.com 的页面,并向 bbb.com/list 发起请求时&#…...

【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》

Liu S, Zha J, Sun J, et al. EdgeYOLO: An edge-real-time object detector[C]//2023 42nd Chinese Control Conference (CCC). IEEE, 2023: 7507-7512. CCC-2023 源码:https://github.com/LSH9832/edgeyolo 论文:https://arxiv.org/pdf/2302.07483 …...

Python打卡 DAY 38

知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…...

调试技巧总结

目录 一.调试1.什么是调试2.调试语义的分类2.1 静态语义2.2 动态语义 二.实用的调试技巧1.屏蔽代码2.借助打印3.查看汇编代码4.调试技巧总结 一.调试 1.什么是调试 调试,通俗易懂地说就是不断排查代码的错误,进行修正的过程,在写代码的时候…...

ubuntu安装blender并配置应用程序图标

ubuntu安装blender并配置应用程序图标 下载blender安装包解压缩并安装启动blender添加应用程序启动图标 下载blender安装包 blender中文服务站的下载网址 这里选择Linux 64位的Blender 4.2.4 LTS。下载速度很快。下载得到 解压缩并安装 将下载的压缩包放在/opt目录下&#…...

基于LBS的上门代厨APP开发全流程解析

上门做饭将会取代外卖行业成为新一轮的创业风口吗?杭州一位女士的3菜一汤88元套餐引爆社交网络,这个包含做饭、洗碗、收拾厨房的全套服务,正在重新定义"到家经济"的边界。当25岁的研究生系着围裙出现在客户厨房,当年轻姑…...

Redisson学习专栏(三):高级特性与实战(Spring/Spring Boot 集成,响应式编程,分布式服务,性能优化)

文章目录 前言一、Spring Boot深度整合实战1.1 分布式缓存管理1.2 声明式缓存1.3 响应式编程 二、分布式服务治理2.1 服务端实现2.2 客户端调用2.3 高级特性2.4 服务治理功能 三、分布式任务调度引擎四、连接池配置与网络参数调优4.1 连接池配置4.2 网络参数调优4.3 集群模式特…...

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享 前言一、相关服务介绍1.1 Huawei Cloud EulerOS介绍1.2 Filestash介绍1.3 华为云Flexus应用服务器L实例介绍二、本次实践介绍2.1 本次实践介绍2.2 本次环境规划三、检查云服务器环境3.1 登录华为云3.2 SSH远…...

基于Docker和YARN的大数据环境部署实践最新版

基于Docker和YARN的大数据环境部署实践 目的 本操作手册旨在指导用户通过Docker容器技术,快速搭建一个完整的大数据环境。该环境包含以下核心组件: Hadoop HDFS/YARN(分布式存储与资源调度)Spark on YARN(分布式计算…...

【大模型】Bert

一、背景与起源 上下文建模的局限:在 BERT 之前,诸如 Word2Vec、GloVe 等词向量方法只能给出静态的词表示;而基于单向或浅层双向 LSTM/Transformer 的语言模型(如 OpenAI GPT)只能捕捉文本从左到右(或右到…...

《Go小技巧易错点100例》第三十四篇

​ 本期分享: 1.sync.Mutex锁复制导致的异常 2.Go堆栈机制下容易导致的并发问题 sync.Mutex锁复制导致的异常 以下代码片段存在一个隐蔽的并发安全问题: type Counter struct {sync.MutexCount int }func foo(c Counter) {c.Lock()defer c.Unlock()…...

vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选

一、页面代码&#xff1a; <template> <!-- 日期范围筛选框 --> <el-date-picker v-model"dateRange" value-format"YYYY-MM-DD" type"daterange" range-separator"至" start-placeholder"开始日期" end-…...

Vue 技术文档

一、引言 Vue 是一款用于构建用户界面的渐进式 JavaScript 框架&#xff0c;具有易上手、高性能、灵活等特点&#xff0c;能够帮助开发者快速开发出响应式的单页面应用。本技术文档旨在全面介绍 Vue 的相关技术知识&#xff0c;为开发人员提供参考和指导。 二、环境搭建 2.1…...

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景 1、网页存档与文档管理 需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。 2、电子报告生成 动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样…...

速通《Sklearn 与 TensorFlow 机器学习实用指南》

1.机器学习概览 1.1 什么是机器学习 机器学习是通过编程让计算机从数据中进行学习的科学。 1.2 为什么使用机器学习&#xff1f; 使用机器学习&#xff0c;是为了让计算机通过数据自动学习规律并进行预测或决策&#xff0c;无需显式编程规则。 1.3 机器学习系统的类型 1.…...

Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用

Ubuntu 下搭建ESP32 ESP-IDF开发环境&#xff0c;网上操作指南很多&#xff0c;本来一直也没有想过要写这么一篇文章。因为我其实不太习惯在linux下开发应用&#xff0c;平时更习惯windows的软件操作&#xff0c;只是因为windows下开发ESP32的应用编译时太慢&#xff0c;让人受…...

[FreeRTOS- 野火] - - - 临界段

一、介绍 临界段最常出现在对一些全局变量进行操作的场景。 1.1 临界段的定义 临界段是指在多任务系统中&#xff0c;一段需要独占访问共享资源的代码。在这段代码执行期间&#xff0c;必须确保没有任何其他任务或中断可以访问或修改相同的共享资源。 临界段的主要目的是防…...

【洛谷P9303题解】AC代码- [CCC 2023 J5] CCC Word Hunt

在CCC单词搜索游戏中&#xff0c;单词可以隐藏在字母网格中&#xff0c;以直线或直角的方式排列。以下是对代码的详细注释和解题思路的总结&#xff1a; 传送门&#xff1a; https://www.luogu.com.cn/problem/P9303 代码注释 #include <iostream> #include <vecto…...

NodeMediaEdge接入NodeMediaServer

如何使用NME接入NMS 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后&#xff0c;可以同NodeMediaServer结合使用。使用图形化的管理…...

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…...

WebSocket指数避让与重连机制

1. 引言 在现代Web应用中&#xff0c;WebSocket技术已成为实现实时通信的重要手段。与传统的HTTP请求-响应模式不同&#xff0c;WebSocket建立持久连接&#xff0c;使服务器能够主动向客户端推送数据&#xff0c;极大地提升了Web应用的实时性和交互体验。然而&#xff0c;在实…...

DrissionPage WebPage模式:动态交互与高效爬取的完美平衡术

在Python自动化领域&#xff0c;开发者常面临两难选择&#xff1a;Selenium虽能处理动态页面但效率低下&#xff0c;Requests库轻量高效却难以应对JavaScript渲染。DrissionPage的WebPage模式创新性地将浏览器控制与数据包收发融为一体&#xff0c;为复杂网页采集场景提供了全新…...