在释放静态内存之前已完成卸载DLL



有人能帮我吗。我们正在研究一个问题,我错过了这个概念。

一个函数创建一个类[A]的静态对象,其中创建了另一个类对象,当用户退出应用程序时,所有窗口都会被破坏,然后在exit()的最后一个系统函数将被调用来清理全局数据,该全局数据调用A的析构函数。

我的问题是,dll会在调用A的析构函数之后甚至之前卸载吗?

在C++DLL或共享对象中,声明为文件静态或类静态实例的对象在DLL映像本身中分配其基本存储。因此,当DLL卸载时,内存将被释放。

这不适用于任何被分配来容纳这些对象的堆分配成员的内存,例如,如果你有一个像这样的静态对象:

struct B {
    basic_string <char> s1;
    B(char*x){s1 = basic_string<char>(x);
    static B b_inst("test");
}

静态对象B::b_inst是在DLL中分配的。传入的原始C字符串"test"在DLL中进行分配。但是由basic_string分配的用于保存"test"的副本的存储是在堆上分配的。

那什么时候清理干净呢?

好吧,就在dll被卸载之前,系统调用dll的入口点(称为DllMain)。事实上,这是由CRT提供的(如果你写一个,你的会被CRT提供的调用,它在之前和之后都运行代码)。CRT DllMain的工作是调用静态构造函数和析构函数,以及静态对象的构造函数和析构函数。

因此,只要你的DLL卸载得很好,并且DllMain运行得很愉快,没有错误/访问冲突等,它们就应该被正确地清理掉。

最新更新