1

谁能帮我这个。我们正在解决一个问题,我错过了这个概念。

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

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

4

1 回答 1

1

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

于 2013-08-21T14:04:36.477 回答