c++ - ProcessExit - DLL 卸载和静态的顺序

标签 c++ windows visual-c++ dll static

有一个 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?

最佳答案

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

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

关于c++ - ProcessExit - DLL 卸载和静态的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12933310/

相关文章:

Windows 批处理或 powershell。替换 "{\n}"文本

windows - 使用 TerminateProcess 时到底有什么风险?

c++ - 将值传递给 main(int, char**)

c - 使用 "Bash on Ubuntu on Windows"编译的 C 脚本是否比在 Windows 中直接编译和运行慢?

宏函数参数中的 C++ 添加

c++ - 为什么我不能返回对压缩字段的引用?

c++ - 使用 boost 预处理器对元组进行字符串化

c++ - std::vector 插入的摊销分析

c++ - 在 Qt 中调整 ./configure 步骤

linux - 在windows/ubuntu上编写node.js raspberrypi程序