DLL中的共享内存

问题描述:

共享内存如何在DLL中工作?DLL中的共享内存

当DLL连接到进程时,它使用与进程相同的内存地址。假设我们在DLL中有以下函数:

int * data = 0; 
int foo() 
{ 
    if (!data) data = new int(random()); 
    return *data; 
} 

当进程A调用这个函数时,它会创建新的对象(int)并返回它的值。 但是现在进程B附加了这个DLL。它调用foo(),但我不明白它将如何工作,因为data正在处理'内存空间。 B如何能够直接使用它?

+0

在进程之间共享内存需要OS API支持,并可在Windows下使用。 – kenny

你是正确的,DLL文件不要跨进程共享内存的进程空间内创建自己独立的内存空间默认。在你的例子中,进程A和B都会得到一个单独的“数据”实例。

如果您有一个设计想要在使用该DLL的所有进程中共享的DLL中具有全局变量,则可以使用here中描述的共享数据段。您可以通过共享数据段共享预先声明的数组和值类型,但绝对不能共享指针。

+2

“Win32 DLL被映射到调用进程的地址空间中。默认情况下,每个使用DLL的进程都有其自己的所有DLL全局和静态变量的实例。”这就是我一直在寻找的东西。谢谢! – user986654

进程B将有无关与流程答data变量B.

+0

它是如何工作的?每次将DLL附加到进程时,都会重新创建所有静态数据?那么它如何“共享”呢? – user986654

+0

@ user986654,进程之间不共享数据。每个进程都有自己的私有空间并重新创建数据。 –

+0

它不共享。 – Joe

你错在这里有两个不同的概念--dll在这个意义上共享内存,所有没有(永远)会改变的东西都是共享的(物理上的)。它正在保存你的RAM,导致DLL中的很多数据是代码和其他常量数据,所以系统只使用它的一个副本,无论有多少进程使用它。这在系统级别上很重要 - 从应用程序角度看,根本没有共享。

然而,像这里描述的内部数据不在进程间共享 - 每个进程都有自己的副本。如果您有兴趣在进程之间共享内存,则需要其他机制。您可能对Creating Named Shared Memory感兴趣。