是否在释放静态内存之前完成卸载DLL?

时间:2013-08-21 13:52:10

标签: c++ dll

任何人都可以帮助我。我们正在研究一个问题,我错过了这个概念。

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

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

1 个答案:

答案 0 :(得分:0)

在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运行愉快且没有错误/访问冲突等,就应该正确清理它们。