在全局变量的初始化/反初始化中使用隐式加载的DLL中的函数

Ale*_*ler 1 c++ windows

考虑一个使用导入库logging.lib的Windows程序,这样logging.dll将在运行时自动加载/卸载。

另外,请考虑主程序的翻译单元之一,其定义类类型的全局变量如下:

struct InitGuard
{
    InitGuard()
    {
        logging::initialize();
    }

    ~InitGuard()
    {
        logging::deinitialize();
    }
};

InitGuard g_initGuard;
Run Code Online (Sandbox Code Playgroud)

除了更好的方法是InitGuard在函数内实例化这一事实之外main

  • 是否可以确保在调用c'tor时已经加载logging.dllInitGuard
  • 甚至更重要的是,是否可以保证在d'tor 返回之前仍不会卸载logging.dllInitGuard

Rem*_*eau 5

是否可以确保   在 调用c'tor时已经加载  logging.dllInitGuard

是。在开始运行任何EXE代码之前,OS Loader会解决对静态链接DLL的所有引用。

甚至更重要的是,是否可以保证  在d'tor  返回之前仍不会卸载  logging.dllInitGuard

是。在EXE的代码运行完毕之前,操作系统不会释放静态链接的DLL。