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 被卸载或进程终止时如何释放资源的主要内容,如果未能解决你的问题,请参考以下文章

异常进程终止时的资源清理

C# 线程运行完之后自己会不会释放掉

ctypes卸载dll

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)

【kill】kill -9 杀不死的进程处理办法

C#动态加载dll 时程序集的卸载问题