首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

调用取消了“Use dynamic RTL”编译的DLL,为什么会出现内存泄露?该如何解决

2012-03-18 
调用取消了“Use dynamic RTL”编译的DLL,为什么会出现内存泄露?最近我用编写了一个DLL,使用了VCL,编译都没

调用取消了“Use dynamic RTL”编译的DLL,为什么会出现内存泄露?
最近我用编写了一个DLL,使用了VCL,编译都没问题。
当我提过个CB编写的主程序调用时,奇怪的问题就来了,
当时的调用是这样的,仅是在FomeCreate中LoadLibrary(),FormClose中FreeLibrary()而已;
如果CB开启了"CodeGuard Validation"的话,运行编译后的主程序,会出现错误提示,
打开生成的“CGL”文件,提示 “内存泄露”:
The memory block (0x011FC66C) [size: 200 bytes] was allocated with SysGetMem
Call Tree:
  0x01865BE8
  0x01865C41
  0x01867E7C
  0x0186778D
  0x01867DD7
  0x0186ACA6

当关闭了"CodeGuard Validation"的话,这个错误就不在提示了,当程序长时间运行后,正常退出系统时,
会出现 内存访问异常的提示;

于是我单独做了个小程序,就这样调用的,仅是在FomeCreate中LoadLibrary(),FormClose中FreeLibrary();
问题依旧;
我不断在DLL文件排查那个内存块没DELETE掉,甚至乎,我把所有的内部变量,函数实现去注释掉了,当问题依旧;
后来无意中在编译DLL时,开启了“Use dynamic RTL”,再给主程序调用时,就不在有"内存泄露"的错误提示了。

这是为什么了?



[解决办法]
CodeGuard有的时候要求比较“严格”。
FormClose不是一定执行的。
方案1,你把FreeLibrary()放到FormCloseQuery执行。
方案2,LoadLibrary和FreeLibrary放到构造函数和析构函数中。

热点排行