2011-09-23 5 views
2

C++ 콘솔 응용 프로그램은 LoadLibrary() 함수를 사용하여 런타임에 DLL을로드 한 다음 DLL에서 내 보낸 일부 함수를 호출합니다. 응용 프로그램이 DLL로 완료되면 FreeLibrary() 함수를 호출하여 DLL을 언로드합니다. DLL이 언로드되거나 응용 프로그램이 종료 될 때까지 DLL 함수 호출로 인해 메모리 누수가 제거됩니까?DLL 언로드시 메모리 누수가 발생했습니다.

답변

8

메모리 누수가 계속됩니다. OS는 어떤 DLL이 메모리를 할당했는지 신경 쓰지 않고, 어떤 프로세스가 메모리를 할당했는지에만 신경을 쓴다.

+0

그래도 아무 것도 작동하지 않습니다. DLL이 어떤 개체를 할당하고 응용 프로그램에 대한 포인터를 반환했다고 가정합니다. DLL을 언로 드 (Unloading)하면 해당 객체를 해제 할 수 있습니다. 흥미로운 문제가 있습니다. – Voo

0

괜찮 았어! 그래서 여기에이 문제를 해결할 수있는 방법이 있습니다. 그 콘솔 응용 프로그램부터 나는 당신이 응용 프로그램을 만들고 있다고 가정합니다. OS가 스택/가상 메모리를 할당하고 힙을 사용하여 힙에 객체를 생성 할 수있는 힙을 할당합니다. 일반적으로 이러한 세부 사항은 단순히 연산자 new를 사용하므로 추상화됩니다!

다음은 작동 할 수 있습니다. OS에서 제공하는 deafault 힙에 대한 핸들 얻기 - GetProcessesHeap(); 그리고 Freelibrary 후에 HeapFree()를 사용하여 힙을 해제하십시오! 이것은 당신에게 할당 된 전체 힙을 지울 것이지만 이것은 동적으로 할당 된 다른 것들도 지울 수 있습니다.

이것은 DLL을로드하기 전에 을 작동시키는 방법입니다. - HeapCreate()를 사용하여 DLL에서 동적 할당을 위해 필요한 개인 힙을 만듭니다. 새/삭제 대신 HeapAlloc 및 HeapDealloc을 사용하여 개인 힙 핸들로 dll에서 개체를 만듭니다. 라이브러리를 사용하여 완료되면 heapdestroy()를 사용하여 힙을 비우십시오!

관련 문제