c++ - 在全局变量的初始化/取消初始化中使用隐式加载的 DLL 中的函数
问题描述
考虑一个使用导入库logging.lib的 Windows 程序,以便在运行时自动加载/卸载logging.dll 。
另外,考虑主程序的一个翻译单元定义了一个类类型的全局变量,如下所示:
struct InitGuard
{
InitGuard()
{
logging::initialize();
}
~InitGuard()
{
logging::deinitialize();
}
};
InitGuard g_initGuard;
除了更好的方法是InitGuard
在函数内实例化之外main
:
- 是否保证在调用c'tor 时已经加载了logging.dll
InitGuard
? - 更重要的是,是否保证在 d'tor 的返回之前还不会卸载logging.dll
InitGuard
?
解决方案
是否保证 在调用 c'tor 时已经加载了 logging.dll
InitGuard
?
是的。在任何 EXE 代码开始运行之前,对静态链接 DLL 的所有引用都由 OS Loader 解析。
更重要的是,是否保证 在 d'tor 的返回之前还不会卸载 logging.dll
InitGuard
?
是的。在 EXE 的代码完成运行之前,操作系统不会释放静态链接的 DLL。
推荐阅读
- python - conditional selection on pandas dataframe
- networking - 当客户端向 DHCP 服务器请求 IP 地址时,为什么还要使用 ARP?
- hibernate - 找不到 Instant 类型的属性描述!在 Spring Data JPA 中
- matlab - 在 matlab 代码中使用 for 循环时出现内存不足错误
- python - python - 如何用重复的x轴绘制数据
- elasticsearch - (Grafana 表)${__cell} 包含撇号/单引号将查询字符串中断到 Kibana
- javascript - XMLHttpRequest javascript原型不起作用
- python - 速度比较。numpy vs python标准
- node.js - 使用 Node.js 的 RSS 编码问题
- c - C - 编程 HI-LO 游戏