2011-09-23 108 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()完成使用庫後,請釋放堆!