有一个EXE隐式加载一些DLL和其他明确的DLL(LoadLibrary)。这个EXE正在执行它的ExitProcess(进程中剩下的1个线程),并作为忙于卸载DLL的一部分,比如A.DLL。
A.DLL(不幸的是)有一个静态的。调用atexit回调并开始调用此静态析构函数,留下一系列析构函数,直到析构函数决定进行一些清理并加载DLL来执行此操作。此DLL执行某些方法,直到由于内存访问冲突而发生崩溃,因为它将要在此DLL中使用的静态不再存在。查看此静态的堆栈跟踪,已将其析构函数作为其DLL卸载的一部分进行调用。
发生什么事了? DLL被加载,执行了一些方法,去使用静态(在同一个DLL中)但是这已被破坏(静态只在卸载dll时被破坏)。那么它是处于执行方法的半边缘状态,但也被破坏了?
EXE似乎在__tmainCRTStartup的上下文中暗示用户创建的main已返回?在用户main或tmainCRTStartup的上下文中是否卸载了DLL?
答案 0 :(得分:4)
就是这么简单:静态对象的析构函数按其创建的相反顺序调用,这是通过注册atexit回调在内部完成的。唯一不同的情况是手动卸载(FreeLibrary)DLL。
您描述的问题仅表明您具有循环依赖关系,这很容易发生在静态构造函数/析构函数中。你应该小心你在析构函数中做了什么,特别是在这一点加载DLL对我来说似乎很危险。