【发布时间】:2016-04-21 00:52:58
【问题描述】:
我确实解决了手头的直接问题,但现在我需要了解它为什么会解决。 ;-)
所以我还有几个问题。
假设我有一个从 DLL 导出的类。现在每次调用时都应该将这个 DLL 加载到内存中:
MyExportedClass *pb = new MyExportedClass;
它应该留在内存中,只有在我调用时才会被卸载:
delete pb;
这对吗?
如果我理解正确并且上一个问题的答案是肯定的,那么在以下情况下应该会发生什么:
我有一个从 dll (dll1) 导出的接口,我有一个从另一个 dll (dll2) 导出的实现。所以每次我执行:
MyInterface *pInterface = new MyImplementation;
这两个 dll 都应该加载到内存中,并且它们应该保留在内存中,直到我调用:
delete pInterface;
这对吗?
现在,如果这个问题的答案是肯定的 - 我是否有控制/说法,首先卸载哪个库,然后是哪个库?或者卸载总是在调用适当类的析构函数后发生?
现在,是否有一个工具可以检查库是否已卸载以及何时卸载?我可能只使用假的 DllMain() 并检查它的 process_detach 情况,但我的印象始终是:在库导出函数时使用 DllMain,在库导出类时不要使用 DllMain。我从 MSVC 5/6 开始就使用这种方法(遵循一本关于 C++ 的书)。
我错了吗,在这两种情况下我仍然可以使用 DLLMain?
谢谢。
【问题讨论】:
-
为什么你认为对象的每次实例化/销毁对整个 DLL 都一样?
-
我对操作系统的理解是,只有在需要内存时(由另一个 DLL、程序等),才会从内存中卸载 DLL。删除对象不会强制卸载 DLL。
-
@deviantfan,不确定你的意思。能详细点吗?
-
@ThomasMatthews,但是当 DLL 被卸载时,我们会有一个悬空指针,对吧?我的意思是对象可以调用函数,但是如果没有 dll,它只会崩溃。那是除非我遗漏了一些东西,并且在这种情况下 dll 将由操作系统自行加载。
-
not sure what you mean我的意思是你在问题中的第一个Is this correct?的答案是No。因此,其余的都没有意义了。