【问题标题】:Memory leaks on DLL unloadDLL 卸载时的内存泄漏
【发布时间】:2011-09-23 18:00:11
【问题描述】:

C++ 控制台应用程序在运行时使用 LoadLibrary() 函数加载 DLL,然后调用 DLL 导出的一些函数。一旦应用程序使用完 DLL,它就会调用 FreeLibrary() 函数来卸载 DLL。 DLL 函数调用导致的内存泄漏是否也会在卸载 DLL 时被删除,或者它们会一直保留到应用程序终止?

【问题讨论】:

    标签: c++ memory dll memory-leaks


    【解决方案1】:

    内存泄漏将继续存在。操作系统不关心哪个 DLL 分配了内存,它只关心哪个进程分配了内存。

    【讨论】:

    • 是的,没有别的办法了。假设 DLL 分配了一些对象并返回了一个指向应用程序的指针。如果卸载 dll 会释放该对象,我们手头就会遇到一些有趣的问题。
    【解决方案2】:

    好的!所以这里是你如何解决这个问题。 因为它是一个控制台应用程序,所以我假设您正在创建应用程序,在这种情况下,操作系统会为您分配堆栈/虚拟内存和堆,您将在其中创建堆上的对象。通常这些细节是从我们那里抽象出来的,因为我们只是使用操作符“new”!

    以下是可行的方法 - 获取操作系统提供的默认堆的句柄 - GetProcessesHeap(); 并使用 HeapFree() 释放 freelibrary 后的堆!这将清除分配给您的整个堆,但这也可能清除其他动态分配的东西。

    这就是你可以让它工作的方法- 在加载 DLL 之前,使用 HeapCreate() 从 DLL 中动态分配内容所需的私有堆。 使用 HeapAlloc 和 HeapDealloc 而不是 new/delete 使用您的私有堆句柄从您的 dll 创建对象。 使用完库后,使用 heapdestroy() 释放堆!

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2021-04-05
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多