Утечки памяти при выгрузке DLL - PullRequest
2 голосов
/ 23 сентября 2011

Консольное приложение C ++ загружает DLL во время выполнения, используя функцию LoadLibrary (), а затем вызывает некоторые функции, экспортируемые DLL. Как только приложение завершает работу с DLL, оно вызывает функцию FreeLibrary () для выгрузки DLL. Будут ли утечки памяти, вызванные вызовами функций DLL, также устраняться при выгрузке библиотеки DLL или они будут оставаться там до завершения работы приложения?

Ответы [ 2 ]

8 голосов
/ 23 сентября 2011

Утечки памяти останутся.Операционная система не заботится о том, какая DLL выделяет память, она заботится только о том, какой процесс выделил память.

0 голосов
/ 26 сентября 2011

Хорошо! так вот как вы могли бы решить эту проблему. поскольку это консольное приложение, я предполагаю, что вы создаете приложение, и в этом случае ОС выделяет стек / виртуальную память и кучу для вас, где вы будете создавать объекты в куче. как правило, эти детали абстрагируются от нас, поскольку мы просто используем оператор «new»!

вот что может сработать - получить дескриптор к куче по умолчанию, предоставляемой вашей ОС - GetProcessesHeap (); и освободите кучу после бесплатной библиотеки, используя HeapFree ()! это очистит всю выделенную вам кучу, но это также может очистить и другие динамически распределенные объекты.

вот как ты можешь заставить это работать перед загрузкой DLL создайте личную кучу, необходимую для динамического выделения содержимого из вашей DLL, используя - HeapCreate (). используйте HeapAlloc и HeapDealloc вместо new / delete для создания объектов из вашей dll с помощью вашего личного дескриптора кучи. освободите кучу с помощью heapdestroy (), как только вы закончите с использованием библиотеки!

...