卸载DLL时内存泄漏

卸载DLL时内存泄漏,dll,memory-leaks,com,openssl,Dll,Memory Leaks,Com,Openssl,我在Windows DLL(C++,伪代码)中有以下内容: 问题是,如果DLL被反复加载和卸载(通过LoadLibrary/freebrary),那么静态数据的值就不会持久存在;因此,每个加载/释放周期都会泄漏所有内存 根据func不能更改的要求,是否有解决内存泄漏的方法 背景:在“真实代码”中,func实际上正在初始化OpenSSL。OpenSSL初始化mallocs一些表并保留指向这些表的静态指针;并且没有释放内存的功能 实际上,几年前我提交了一个0.9.8的补丁,它确实提供了与我所知道的

我在Windows DLL(C++,伪代码)中有以下内容:

问题是,如果DLL被反复加载和卸载(通过
LoadLibrary
/
freebrary
),那么静态数据的值就不会持久存在;因此,每个加载/释放周期都会泄漏所有内存

根据
func
不能更改的要求,是否有解决内存泄漏的方法


背景:在“真实代码”中,
func
实际上正在初始化OpenSSL。OpenSSL初始化mallocs一些表并保留指向这些表的静态指针;并且没有释放内存的功能

实际上,几年前我提交了一个0.9.8的补丁,它确实提供了与我所知道的所有分配函数相对应的释放函数;但在查看1.0.0版本时,有人对其中的大部分内容进行了评论,说“这永远不应该被解除分配!!!”。负责人显然不知道如何卸载DLL,他们假设静态指针在进程的生命周期内保持其值


另外,在“真实代码”中,DLL包含COM对象,但我所知道的没有任何区别。我目前正在解决这个问题,让
DllCanUnloadNow
始终返回No,但这并不理想。

您的情况听起来正是
DllCanUnloadNow
设计的目的。为什么不理想?注意:与此类似,但它关注于执行加载/空闲操作的应用程序可以对泄漏做些什么;而不是DLL能做什么。@GregHewgill也许我误解了卸载DLL的目的;我认为它的目的是允许调用进程在不再需要DLL时回收DLL使用的内存。我的DLL确实使用了大量内存,除了这个特定的泄漏块,因此我认为允许卸载我的DLL是“良好行为”。在大多数情况下,是的,但在您的情况下,由于您无法清除DLL执行的所有分配,我会尽你所能清理并保留OpenSSL内容。如果
ptr
可以在func()之外以某种方式进行访问,那么可以在
DLL\u进程\u DETACH
中进行取消初始化。
void func()
{
    static void *ptr;

     if ( !ptr )
         ptr = malloc(50000000);
}