DLL 被卸载或进程终止时如何释放资源
Posted
技术标签:
【中文标题】DLL 被卸载或进程终止时如何释放资源【英文标题】:How to Free Resources when DLL is Unloaded or Process Terminates 【发布时间】:2010-11-09 15:11:06 【问题描述】:当我的 MFC DLL 被加载时,一个类在 dllmain
中被实例化。当 DLL 被卸载或其进程完成时,如何释放为此分配的资源?这会由系统自动完成吗?我正在使用 Visual Studio 2008。谢谢。
【问题讨论】:
关于这个问题:这不是标准的atexit
函数的用途吗?我知道标准没有谈论 dll,所以我在这里更多地谈论编译器行为。
@Matthieu M.:提交这个作为你的答案,我会接受的。
【参考方案1】:
在您的 dll 主函数中,只需处理 DLL_PROCESS_DETACH 的情况。
BOOL WINAPI DllMain( HMODULE hDll, DWORD dwReason, PVOID pvReserved )
switch ( dwReason )
case DLL_PROCESS_DETACH:
// the dll is being detached, do you clean up here
break;
请记住,有些事情在 DllMain() 内部是不可能的,所以你希望你在那里做的任何事情都非常快速和简单。
【讨论】:
谢谢。这看起来是一个很好的解决方案,但我的 DLL 入口点看起来像这样:int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
。它是在 Visual Studio 2008 中通过转到 New Project -> Win32 Project -> 并选择 DLL、Extensions 和 MFC 作为选项生成的 MFC DLL。【参考方案2】:
用全局 T
变量替换您的 new
-ing 并将指针存储在全局 T*
变量中。
这让自动 C++ 机器为您完成工作。
在 DLL 卸载时,会自动调用析构函数。
注意:支持从多个线程加载和卸载 DLL,可能会更困难。
干杯,
【讨论】:
如果 DLL 加载和卸载多次,你确定这能正常工作吗? @Steve:我们永远无法保证 Visual C++ 中不存在又一个错误(这取决于编译器,C++ 神圣标准对动态库无话可说)。因此,如果这是一个问题,那么我会对其进行测试。好点子。以上是关于DLL 被卸载或进程终止时如何释放资源的主要内容,如果未能解决你的问题,请参考以下文章