DLL中的共享内存

时间:2011-10-09 18:49:33

标签: c++ c windows dll

共享内存如何在DLL中运行?

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

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

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

3 个答案:

答案 0 :(得分:6)

你是对的,默认情况下,DLL不会跨进程共享内存。在您的示例中,进程A和B都将获得单独的“数据”实例。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

进程B将拥有自己独立的内存空间,与进程A无关。data变量将在B的进程空间内创建。