我在Windows DLL(C ++,伪代码)中有以下内容:
void func()
{
static void *ptr;
if ( !ptr )
ptr = malloc(50000000);
}
问题是如果重复加载和卸载DLL(通过LoadLibrary
/ FreeLibrary
),则静态数据的值不会持续存在;因此每个加载/自由循环都会泄漏所有内存。
根据func
无法更改的要求,是否有内存泄漏的解决方案?
背景:在“真实代码”中,func
实际上是在初始化OpenSSL。 OpenSSL初始化mallocs一些表并保留一个指向这些表的静态指针;并且没有释放该内存的功能。
几年前我实际上已经提交了一个补丁到0.9.8-something,确实提供了与我所知道的所有这些分配函数相对应的释放函数;但是检查1.0.0版本时,有人已经注释掉了大部分内容,“这应该永远不会被解除分配!”。负责人显然不知道卸载DLL,他们认为静态指针在进程的生命周期内保留了它的值。
此外,在“真实代码”中,DLL包含COM对象,但这与我所知道的没有区别。我目前正在解决这个问题,让DllCanUnloadNow
始终返回否,但这并不理想。