gpt4 book ai didi

c++ - 释放DLL之前是否已完成卸载DLL?

转载 作者:行者123 更新时间:2023-12-02 10:26:08 26 4
gpt4 key购买 nike

谁能帮我这个。我们正在研究一个问题,但我没有想到这个概念。

函数创建一个类的静态对象,并在其中创建另一个类对象,当用户退出应用程序时,所有窗口均被销毁,然后在最后一个系统函数exit()处调用该函数以清除全局数据这称为A的析构函数。

我的问题是,在调用A的析构函数之后还是在此之前将dll卸载?

最佳答案

在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会在代码之前和之后运行)。 CRT DllMain的工作是调用静态构造函数和析构函数,以及静态对象的构造函数和析构函数。

因此,只要您的DLL正常卸载,并且DllMain顺利运行且没有错误/访问冲突等,则应该正确清除它们。

关于c++ - 释放DLL之前是否已完成卸载DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18359297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com