【问题标题】:Where are global variables of a DLL stored in memory?DLL 的全局变量存储在内存中的什么位置?
【发布时间】:2011-08-17 00:03:40
【问题描述】:

假设您有一个使用 C++ DLL 的 VB6 应用程序。它们共享相同的内存(您可以使用来自另一个的指针)。 DLL 在 VB6 应用程序中声明为 Public Declare Function ... Lib ...

那么,这与“堆栈从内存的一侧增长,堆从另一侧”的哲学有什么关系呢? DLL的堆栈在哪里?启动应用程序时是否分配了全局 DLL 变量?如果是这样,为什么当我尝试从 DLL 运行函数时它只给我一个错误?

【问题讨论】:

  • 你为什么不给我们一个提示并告诉我们错误信息?
  • 没有错误。它完美地工作。我只是想知道 DLL 的全局变量在内存中的位置。我认为一个进程的一侧是堆增长,另一侧是堆栈——这使得很难解释动态加载的 DLL 的全局变量。

标签: c++ windows dll vb6 global-variables


【解决方案1】:

VB6 将thread local storage 用于模块级变量,而不是数据段。这意味着模块中的公共(全局)变量可以在每个不同线程中具有不同的值。这不是 C/C++ 开发人员所习惯的。

【讨论】:

    【解决方案2】:

    全局变量存储在数据段中。

    http://en.wikipedia.org/wiki/Data_segment

    堆栈仅用于局部变量。

    【讨论】:

    • 是的,数据段是 OP 缺少的内存部分。局部变量存在于堆栈中,动态分配的对象存在于堆中,但静态/全局变量存在于它们所属的 exe 或 dll 的数据段中。
    【解决方案3】:

    全局 DDL 符号将位于 DLL 映像本身中。如果 DLL 使用符号作为它附加一些动态内存的指针,那么内存将来自动态分配的任何来源(通常是 CRT 使用的堆)。我们需要确切了解 C++ 导入的 VB 声明的样子以及 C++ DLL 的作用(可能在 DllMain 上初始化,可能是 DLL 映像中的静态区域,可能需要调用一些 Init 函数等等等) .

    “堆栈从内存的一侧增长,堆从另一侧增长”也许在 8088 处理器上是正确的,在现代平台上不会发生这样的事情。每个线程都会分配堆栈并向上分配,这是真的,但一个进程中可能有数百个堆栈。堆被分配到所有地方并且基本上随机增长。一个典型的进程也有几个堆。

    【讨论】:

      【解决方案4】:

      每个线程通常有一个堆栈。 DLL 中的函数将使用当前线程(被调用的线程)的堆栈。

      请参阅 Remus 对您关于内存管理的其他问题的回答。

      【讨论】:

        猜你喜欢
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2014-05-08
        • 2021-10-17
        • 2015-06-23
        • 2010-12-07
        相关资源
        最近更新 更多