ProcessExit – DLL卸载和静态的顺序

有一个EXE隐式加载一些DLL的和其他明确的(LoadLibrary)。 这个EXE正在执行它的ExitProcess(1个线程在进程中),并且作为忙于卸载DLL的一部分,比如说A.DLL。

A.DLL(不幸)有一个静态的。 atexitcallback被调用,并且这个静态的析构函数开始被调用,留下了一个析构函数的踪迹,直到一个析构函数决定做一些清理并加载一个DLL来做到这一点。 此DLL执行一些方法,直到由于内存访问冲突发生崩溃,因为它将要在此DLL中使用的静态已不再存在。 查看这个静态的堆栈跟踪,它的析构函数已经作为DLL卸载的一部分被调用。

发生了什么? 该DLL被加载,执行一些方法,去使用一个静态(在同一个DLL中),但这已经被破坏(静态只有在卸载DLL时被破坏)。 那么处于执行方法的半边缘状态,也正在被破坏吗?

EXE似乎在__tmainCRTStartup的情况下,这意味着用户创build主返回? 在用户main或tmainCRTStartup的上下文中,DLL是否被卸载?

这很简单:静态对象的析构函数按照创建的相反顺序调用,这是通过注册atexit回调来完成的。 唯一不同的情况是如果您手动卸载(FreeLibrary)DLL。

你所描述的问题只是表明你有一个循环的依赖,这很容易发生在静态的构造函数/析构函数中。 你应该小心在析构函数中做什么,特别是在这个时候加载DLL对我来说似乎相当危险。