: 예를 들어, 다음과 같은 기본 클래스 또는 유틸리티 클래스를 사용할 수 있습니다 동일한 DLL을 사용하는 경우 각 프로세스는 해당 DLL의 정적 (또는 "전역") 데이터의 자체 복사본을 가져옵니다.
목록을 DLL의 전역 변수로 만들고 모든 응용 프로그램에서 해당 DLL에 연결하기 만하면됩니다. 그렇게하면 주변에 아무 것도 전달할 필요가 없습니다.
다중 DLL 프로세스에서 개체가 파괴되는 순서를 예측할 수 없기 때문에 목록의 파괴를 트래핑하는 것이 어려워집니다.
main
또는 WinMain
기능이 끝나면 목록의 내용을 덤프하는 것이 훨씬 간단합니다.
스마트 포인터 클래스를 일관된 방식으로 사용하지 않는 경우 그렇게하십시오. 또한 순환 참조 카운트를 찾아 볼 가치가 있습니다. 오브젝트 A는 오브젝트 B에 대한 카운트를 가지며, 반대표입니다. 이는 출시되지 않은 개체의 일반적인 원인입니다.
업데이트 :
실행하고 객체를 해제 할 모든 정적 소멸자를 강제로, 그래서 당신은 당신은 당신의 응용 프로그램 특정 방법을 구성해야합니다, 나중에 목록의 항목을 검사 할 수 있습니다.
프로세스를 시작하는 EXE가 매우 작다고 가정하고 실제로 모든 작업을 수행하는 다른 DLL을로드합니다. 이 다른 DLL은 LoadLibrary로로드됩니다. 어쩌면 (아마도 COM 또는 COM과 유사한 시스템으로). LoadLibrary API는 DLL을 프로세스로로드하거나 DLL이 이미로드 된 경우 내부 참조 카운터를 증가시켜 작동합니다. FreeLibrary API는 카운터가 0에 도달 할 때까지 카운터를 줄인 다음 DLL을 언로드합니다 (DLL의 정적 소멸자가 실행될 시점).
여기에 모든 미결 참조 된 개체의 목록을 포함하는 진단 DLL을 추가합니다. 다른 모든 DLL은 진단 DLL에 가져 오기 - lib 연결을 사용하며 EXE는 LoadLibrary도 사용합니다.
main
이 끝나면 EXE는 이전에로드 한 DLL 핸들 목록을 검토하고 모두에 대해 FreeLibrary를 호출합니다. 진단 DLL이로드 된 상태로두면 진단 DLL이 끝까지 유지됩니다. 그것은 적어도 이론입니다.
하지만 다른 DLL을 언로드해야하는 순서는 무엇입니까? A.DLL에 B.DLL에 정의 된 객체에 대한 정적 포인터가있는 경우 먼저 A를 먼저 언로드해야합니다. 따라서 다양한 DLL이 어떻게 "계층화 된"아키텍처를 형성하는지에 대한 아이디어가 필요합니다. 하위 계층에 따라 상위 계층이 달라 지므로 안전한 순서로 언로드 할 수 있습니다.
또한 모든 DLL을 언로드 한 후에는 DLL의 개체를 참조하는 진단 목록의 항목이 이제 힙의 유효한 데이터를 가리키고 있지만 vtable은 정의 된 코드를 가리키고 있습니다 이제는 언로드 된 DLL로 인해 해당 객체에서 가상 함수를 호출 할 수 없게됩니다. 그래도 데이터를 검토 할 수 있어야합니다.
죄송합니다. 무엇이 문제입니까? –