【发布时间】:2011-09-23 18:00:11
【问题描述】:
C++ 控制台应用程序在运行时使用 LoadLibrary() 函数加载 DLL,然后调用 DLL 导出的一些函数。一旦应用程序使用完 DLL,它就会调用 FreeLibrary() 函数来卸载 DLL。 DLL 函数调用导致的内存泄漏是否也会在卸载 DLL 时被删除,或者它们会一直保留到应用程序终止?
【问题讨论】:
标签: c++ memory dll memory-leaks
C++ 控制台应用程序在运行时使用 LoadLibrary() 函数加载 DLL,然后调用 DLL 导出的一些函数。一旦应用程序使用完 DLL,它就会调用 FreeLibrary() 函数来卸载 DLL。 DLL 函数调用导致的内存泄漏是否也会在卸载 DLL 时被删除,或者它们会一直保留到应用程序终止?
【问题讨论】:
标签: c++ memory dll memory-leaks
内存泄漏将继续存在。操作系统不关心哪个 DLL 分配了内存,它只关心哪个进程分配了内存。
【讨论】:
好的!所以这里是你如何解决这个问题。 因为它是一个控制台应用程序,所以我假设您正在创建应用程序,在这种情况下,操作系统会为您分配堆栈/虚拟内存和堆,您将在其中创建堆上的对象。通常这些细节是从我们那里抽象出来的,因为我们只是使用操作符“new”!
以下是可行的方法 - 获取操作系统提供的默认堆的句柄 - GetProcessesHeap(); 并使用 HeapFree() 释放 freelibrary 后的堆!这将清除分配给您的整个堆,但这也可能清除其他动态分配的东西。
这就是你可以让它工作的方法- 在加载 DLL 之前,使用 HeapCreate() 从 DLL 中动态分配内容所需的私有堆。 使用 HeapAlloc 和 HeapDealloc 而不是 new/delete 使用您的私有堆句柄从您的 dll 创建对象。 使用完库后,使用 heapdestroy() 释放堆!
【讨论】: