2011-09-23 109 views
2

C++控制台应用程序在运行时使用LoadLibrary()函数加载DLL,然后调用由DLL导出的某些函数。一旦应用程序完成DLL,它会调用FreeLibrary()函数来卸载该D​​LL。 当DLL被卸载时,由DLL函数调用引起的内存泄漏是否也会被移除,或者直到应用程序终止,它们将保持在那里?DLL卸载时的内存泄露

回答

8

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

+0

是的,没有其他的工作。假设DLL分配了一些对象并返回了一个指向应用程序的指针。如果卸载dll会释放该对象,那么我们手边会有一些有趣的问题。 – Voo

0

好吧!所以这里是你如何解决这个问题。 因为它的一个控制台应用程序我假设你正在创建应用程序在这种情况下操作系统分配堆栈/ virtualmem和堆在哪里你会在堆上创建对象。通常这些细节是从我们这里抽象出来的,因为我们只是使用运算符“新”!

这是什么可能工作 - 得到您的操作系统提供的deafault堆的句柄 - GetProcessesHeap(); 并使用HeapFree()在freeelibrary之后释放堆!这将清除分配给你的整个堆,但是这也可以清除其他动态分配的东西。

这是你如何使它工作 - 加载DLL之前使用 - HeapCreate()从您的DLL动态分配的东西创建所需的私人堆。 使用HeapAlloc和HeapDealloc而不是new/delete来使用您的私人堆处理从您的dll创建对象。 使用heapdestroy()完成使用库后,请释放堆!