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

跟我学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发送消息到动态库中时,要保证相关的变量仍然存在。

五、总结

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

http://www.xdnf.cn/news/10131.html

相关文章:

  • 2025年渗透测试面试题总结-匿名[校招]红队攻防工程师(题目+回答)
  • 机器人变量类型与配置
  • 引领机器人交互未来!MANUS数据手套解锁精准手部追踪
  • 大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱
  • Linux入门——入门常用基础指令(3)
  • 课程介绍:《ReactNative基础与实战指南2025》
  • 【前端优化】使用speed-measure-webpack-plugin分析前端运行、打包耗时,优化项目
  • 20250530-C#知识:万物之父Object
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • JS 事件循环详解
  • 告别重复 - Ansible 配置管理入门与核心价值
  • 在 Linux 上安装 Minikube:轻松搭建本地 Kubernetes 单节点集群
  • 项目管理工具Maven
  • java/mysql/ES下的日期类型分析
  • 【FlashRAG】本地部署与demo运行(二)
  • PHP7内核剖析 学习笔记 第九章 PHP基础语法的实现
  • [特殊字符] xbatis 一款好用 ORM 框架 1.8.8-M2 发布,节省 1/3 代码和时间的框架!!!
  • Drawio编辑器二次开发
  • 【pytorch学习】土堆pytorch学习笔记2
  • 【Linux】权限相关指令
  • Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
  • 【仿生机器人系统设计】涉及到的伦理与安全问题
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)
  • 代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )
  • 历年武汉大学计算机保研上机真题
  • 服务器液冷:突破散热瓶颈,驱动算力革命的“冷静”引擎
  • 美国服务器文件系统的基本功能和命令
  • ansible-playbook 进阶 接上一章内容
  • dart实现单client连接的grpc server (以ip地址作判断)