【问题标题】:How to Free Resources when DLL is Unloaded or Process TerminatesDLL 被卸载或进程终止时如何释放资源
【发布时间】:2010-11-09 15:11:06
【问题描述】:

当我的 MFC DLL 被加载时,一个类在 dllmain 中被实例化。当 DLL 被卸载或其进程完成时,如何释放为此分配的资源?这会由系统自动完成吗?我正在使用 Visual Studio 2008。谢谢。

【问题讨论】:

  • 关于这个问题:这不是标准的atexit 函数的用途吗?我知道标准没有谈论 dll,所以我在这里更多地谈论编译器行为。
  • @Matthieu M.:提交这个作为你的答案,我会接受的。

标签: c++ visual-studio-2008 dll mfc resources


【解决方案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++ 神圣标准对动态库无话可说)。因此,如果这是一个问题,那么我会对其进行测试。好点子。
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多