动态链接库的释放问题

昨天开发一个程序,退出时总是出现延迟退出或者根本无法退出的问题,于是开始了找问题的过程:

1,将main函数中所有窗口和实例化对象都注掉,仍然有此问题;

2,将模块代码从工程中全部exclude掉,程序退出不再延迟;

3,挨个加入模块代码,并试验程序是否仍有退出延迟现象;

经过这三步处理,终于发现在加载到数据库模块时程序会出现退出延迟的情况。

 

新建空白工程,将数据库模块单独加入并测试:

1,注掉静态函数和唯一实例,无效;

2,注掉与mysql.h相关的所有函数,程序退出时不再延迟;

于是推测是mysql.h的api函数调用带来的动态链接库dll引用的问题,也就是说程序在编译时根据代码中的mysql API函数(mysql_init等)决定在程序启动时加载mysql动态链接库libmysql.dll,结果退出时dll释放出现了问题。

当前所用的mysql版本为5.0,将libmysql.dll更新为5.5,程序退出延迟问题消失。

 

至此,终于明白了动态链接库的真正含义,以前只是读书本,没有亲身体会。附百度百科:

 

动态链接,可执行文件装载时或运行时,由操作系统的装载程序加载库。

大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载称为装载时加载 ,被包括Windows和Linux的大多数系统采用。装载程序在加载应用软件时要完成的最复杂的工作之一就是加载时链接。其他操作系统可能在运行时解析引用。在这些系统上,可执行程序调用操作系统API,将库的名字,函数在库中的编号和函数参数一同传递。操作系统负责立即解析然后代表应用调用合适的函数。这种动态链接叫做运行时链接。因为每个调用都会有系统开销,运行时链接要慢得多,对应用的性能有负面影响。现代操作系统已经很少使用运行时链接。

  可以动态链接的库,在Windows上是dynamic link library (DLL),在UNIX或Linux上是Shared Library。库文件是预先编译链接好的可执行文件,存储在计算机的硬盘上。大多数情况下,同一时间多个应用可以使用一个库的同一份拷贝,操作系统不需要加载这个库的多个实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值