DLL的全局变量存储在内存中
Where are global variables of a DLL stored in memory?
假设你有一个使用c++ DLL的VB6应用程序。它们共享相同的内存(您可以在另一个中使用其中一个的指针)。DLL是通过Public Declare Function ... Lib ...
那么这如何符合"堆栈从内存的一边增长,堆从另一边增长"的哲学呢?DLL的堆栈在哪里?当应用程序启动时,是否分配了全局DLL变量?如果是这样,为什么它只给我一个错误,当我试图从DLL运行一个函数?
VB6使用线程本地存储模块级变量,而不是数据段。这意味着模块中的公共(全局)变量在不同的线程中可以有不同的值。
全局变量存储在数据段中。
http://en.wikipedia.org/wiki/Data_segment栈只用于局部变量
全局DDL符号将在DLL映像本身中。如果DLL使用该符号作为指针,它将一些动态内存附加到该指针上,那么这些内存将来自动态分配的任何地方(通常是CRT使用的堆)。我们需要确切地看到c++导入的VB声明是什么样的,以及c++ DLL是做什么的(可能是在DllMain上初始化,可能是DLL映像中的静态区域,可能需要调用一些Init函数等等)。
"堆栈从内存的一边增长,堆从另一边增长"可能在8088处理器上是正确的,在现代平台上没有这样的事情发生。堆栈为每个线程分配并向上分配,这是真的,但一个进程中可能有数百个堆栈。堆被分配到各处,基本上是随机增长的。一个典型的进程中也有几个堆。
每个线程通常有一个堆栈。DLL中的函数将使用当前线程(调用该函数的线程)的堆栈。
请参阅Remus对您关于内存管理的其他问题的回答
相关文章:
- 将字符串存储在c++中的稳定内存中
- 类型总是使用其大小存储在内存中吗
- 使用无符号字符数组有效存储内存
- 具有内存顺序的原子负载存储
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 可用存储空间会消耗更多剩余内存吗?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 将数据存储在内存中以供以后访问
- 英特尔将指令存储在重叠的内存区域
- 关于矢量内存存储
- 如何使一个线程中的内存存储"promptly"在其他线程中可见?
- c++中用于常量数据的内存存储
- 内存存储可以在 OoOE 处理器中真正重新排序吗?
- 动态分配的内存存储说明
- 在 std::vector 中存储指针会破坏连续内存存储的优势
- #定义指令内存存储
- 跨语言的内存存储