关于 Dynamic atexit destructor for ***

Dynamic atexit destructor for xxx

一般遇到这个 call stack 很可能是全局变量析构函数中有依赖导致的。这个 call stack 会很短(因为有可能是任何情况导致程序退出),直接分析可能找不出原因。

至于全局变量的析构顺序,c++中没有明确定义,一般各个编译器实现为:根据构造的顺序逆向析构。

但是全局变量的构造又是很难控制的,以为各个全局变量会分布在不同的cpp文件中(编译单元)。

所以最好不要在全局变量析构函数中做任何的清除工作,也不要让全局变量的析构函数之间有任何相互调用或依赖

在程序第一次调用 LoadLibraryLoadLibraryEx 的时候,该 dll 模块数据和代码都会被映射到进程的虚拟地址空间,并且该 dll 引用计数会加一. 如果该程序再次调用 LoadLibrary orLoadLibraryEx 的时候,只会增加引用计数。

当一个 dll 被解除映射(DLL_PROCESS_DETACH)或者 unload 的时候,在该dll中定义的全局变量会被析构。这个析构函数的就是通过 Dynamic Registerd atexit 这个回调函数调用的。

所以,当碰到这个问题的时候,有可能是 dll 被 unload 了,而导致 dll 被 unload 有可能是程序的异常退出。

因此,这种情况很有可能是异常导致 dll 被 detach,从而导致全局变量被析构。

这个时候需要打开 Visual StudioException Settings , 把异常断点打上,捕捉到异常抛出的代码段。

  1. https://blogs.msdn.microsoft.com/oldnewthing/20170203-00/?p=95345
  2. https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值