调用取消了“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放到构造函数和析构函数中。