ProcessExit - DLL 卸载和静态的顺序

Sci*_*ion 3 c++ windows dll static visual-c++

有一个 EXE 隐式加载一些 DLL 和其他显式加载 (LoadLibrary)。该 EXE 正在执行其 ExitProcess(进程中剩余 1 个线程),并且作为繁忙卸载 DLL(例如 A.DLL)的一部分。

A.DLL(不幸的是)有一个静态的。调用 atexit 回调,并开始调用该静态的析构函数,留下一系列析构函数,直到析构函数决定进行一些清理并加载 DLL 来执行此操作。该 DLL 执行一些方法,直到由于内存访问冲突而发生崩溃,因为它将在此 DLL 中使用的静态不再存在。查看此静态的堆栈跟踪,它的析构函数已作为其 DLL 卸载的一部分被调用。

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

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

小智 5

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

您描述的问题仅表明您具有循环依赖关系,这很容易在静态构造函数/析构函数中发生。你应该小心你在析构函数中所做的事情,尤其是在此时加载 DLL 对我来说似乎相当危险。