DLL卸载时内存泄漏 C++控制台应用程序使用LooLabyAuthor()函数在运行时加载DLL,然后调用DLL导出的一些函数。应用程序处理完DLL后,将调用FreeLibrary()函数卸载DLL。 卸载DLL时,DLL函数调用导致的内存泄漏是否也会被删除,或者在应用程序终止之前,它们将一直存在?

DLL卸载时内存泄漏 C++控制台应用程序使用LooLabyAuthor()函数在运行时加载DLL,然后调用DLL导出的一些函数。应用程序处理完DLL后,将调用FreeLibrary()函数卸载DLL。 卸载DLL时,DLL函数调用导致的内存泄漏是否也会被删除,或者在应用程序终止之前,它们将一直存在?,c++,memory,dll,memory-leaks,C++,Memory,Dll,Memory Leaks,内存泄漏将继续存在。操作系统不关心哪个DLL分配了内存,它只关心哪个进程分配了内存 好吧!下面是解决这个问题的方法。 由于它是一个控制台应用程序,我假设您正在创建应用程序。在这种情况下,操作系统会为您分配堆栈/虚拟内存和堆,您可以在其中创建堆上的对象。一般来说,这些细节都是从我们这里抽象出来的,因为我们只是简单地使用操作符“new” 以下是可能有效的方法- 获取操作系统提供的DEAFULT堆的句柄-getProcessHeap(); 并使用HeapFree()在freelibrary之后释放堆!

内存泄漏将继续存在。操作系统不关心哪个DLL分配了内存,它只关心哪个进程分配了内存

好吧!下面是解决这个问题的方法。 由于它是一个控制台应用程序,我假设您正在创建应用程序。在这种情况下,操作系统会为您分配堆栈/虚拟内存和堆,您可以在其中创建堆上的对象。一般来说,这些细节都是从我们这里抽象出来的,因为我们只是简单地使用操作符“new”

以下是可能有效的方法- 获取操作系统提供的DEAFULT堆的句柄-getProcessHeap(); 并使用HeapFree()在freelibrary之后释放堆!这将清除分配给您的整个堆,但也可能清除其他动态分配的内容

这就是你能让它工作的方法- 在加载DLL之前,使用-HeapCreate()创建动态分配DLL中的内容所需的私有堆。 使用HeapAlloc和HeapDealloc,而不是new/delete,使用私有堆句柄从dll创建对象。
使用完库后,使用heapdestroy()释放堆

是的,没有别的办法。假设DLL分配了一些对象并返回了指向应用程序的指针。如果卸载dll将释放该对象,我们将面临一些有趣的问题。