【问题标题】:Who allocates heap to a DLL? [closed]谁为 DLL 分配堆? [关闭]
【发布时间】:2011-06-14 11:10:54
【问题描述】:

假设我使用 MS Visual Studio 2005/2008 开发了一个 DLL,比如 1.dll,然后我在加载时(使用头文件和 .lib 文件)将这个 DLL 链接到控制台应用程序,比如 1.exe,然后当在 DLL 内部,如果我在运行时分配内存,那么谁将堆(空闲存储)分配给 DLL。

据我了解,DLL 将进程的地址空间用于数据、代码和堆栈。

【问题讨论】:

  • 谁明白 StackOverflow 上的这个问题?
  • @leppie:请看,我已经试着解释清楚我的问题了。
  • @leppie:这个问题不值得投反对票!
  • 这并不是说@leppie 对你投了反对票。但无论如何我们真的不明白你在说什么。
  • DLL 没有堆栈。线程有栈。

标签: windows dll


【解决方案1】:

当你制作一个 Dll 时——你总是用某种语言编写它——在你的例子中是 C++ 使用 Visual Studio 2005 或 2008。

在这种情况下,C++ 运行时负责创建它的 freestore 并决定如何分配它。

具体来说,如果您使用 Dll 运行时选项,则单个 dll - msvcrtxx.dll - 管理一个在所有 dll 和 exe 之间共享的单个 freestore,这些 dll 链接到该 dll。

如果您在设置 exe 和 dll 时使用静态运行时选项,则 exe 和每个 dll 都会获得自己的内置 libc 实例,并具有自己的 freestore 管理。

【讨论】:

    【解决方案2】:

    当您在 DLL 中执行代码时,代码会在您的进程上下文和正在调用的线程上执行,这样,内存就会在您的进程空间中分配。

    DLL 的实现当然可以跨越新线程或新进程。在后一种情况下,内存分配将在新的分叉进程中进行。

    这意味着当 1.exe 执行 DLL 时,所有分配的内存(包括堆栈)都会进入您的进程内存空间(即,如果 DLL 分配 1 GB 内存,那么它将反映在您的进程内存消耗中)。

    【讨论】:

      【解决方案3】:

      您负责内存管理。 DLL 具有单独的堆,因此您需要自己进行管理。当然,根据您的环境,可能会有专门的新增/删除功能为您提供方便。

      有两种类型的动态内存需要处理,和分开

      • 您可以使用调用process' heap,但显然,对于每个调用进程来说,这将是不同的。因此,您仅将其用于数据,具体取决于调用者。

      • 对于您的 DLL 通常使用的内存,独立于调用者,您必须使用 HeapCreate 及其同级函数获得一个单独的“私有”堆。

      注意不要将记忆的责任转嫁给其他任何人。您的 DLL 分配的内容,您的 DLL 将删除 - 否则,您会遇到麻烦。这应该是基本规则,但是在 GC 上有些人忘记了如何负责任地使用内存,所以我提一下。

      【讨论】:

      • 你这里指的是什么?谁为 DLL 提供堆?
      • @Vikas:当编写DLL时,那么的工作就是做内存管理。
      • 投反对票的人能解释一下他/她的理由吗?
      猜你喜欢
      • 2013-05-10
      • 2011-03-18
      • 2012-12-23
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多