假设您有一个使用C ++ DLL的VB6应用程序。它们共享相同的内存(您可以使用另一个中的指针)。 DLL在VB6应用程序中使用Public Declare Function ... Lib ...
那么这又如何适应“堆栈从内存的一侧增长,从另一方面堆积”的理念呢? DLL的堆栈在哪里?是否在应用程序启动时分配了全局DLL变量?如果是这样,为什么当我尝试从DLL运行函数时它只会给我一个错误?
答案 0 :(得分:4)
答案 1 :(得分:4)
VB6将thread local storage用于模块级变量,而不是数据段。这意味着模块中的公共(全局)变量可以为每个不同的线程具有不同的值。这不是C / C ++开发人员习惯的原因。
答案 2 :(得分:2)
全局DDL符号将位于DLL图像本身中。如果DLL使用符号作为指向它附加某些动态内存的指针,那么内存将来自动态分配来自的任何内容(通常是CRT使用的堆)。我们需要确切地看到C ++导入的VB声明是什么样的以及C ++ DLL的作用(可能是在DllMain上初始化,可能是DLL映像中的静态区域,可能需要调用某些Init函数等等)
“堆栈从内存的一侧增长,堆从另一侧增长”可能在8088处理器上也是如此,现代平台上没有这样的事情发生。堆栈每个线程分配并向上,真实,但在一个进程中可能有数百个堆栈。堆在整个地方被分配并且基本上随机增长。一个典型的过程也有几个堆。
答案 3 :(得分:1)
每个线程通常有一个堆栈。 DLL中的函数将使用当前线程的堆栈(调用的线程)。
请参阅Remus对您关于内存管理的其他问题的回答。