共享内存如何在DLL中运行?
当DLL附加到进程时,它使用与进程相同的内存地址。假设我们在DLL中有以下函数:
int * data = 0;
int foo()
{
if (!data) data = new int(random());
return *data;
}
当进程A调用此函数时,它会创建新对象(int)并返回其值。
但是现在进程B附加了这个DLL。它调用foo()但我不明白它是如何工作的,因为data
正处于进程中'一个内存空间。 B如何能够直接使用它?
答案 0 :(得分:6)
你是对的,默认情况下,DLL不会跨进程共享内存。在您的示例中,进程A和B都将获得单独的“数据”实例。
如果您的设计中希望在使用该DLL的所有进程中共享DLL中的全局变量,则可以使用here所述的共享数据段。您可以通过共享数据段共享预先声明的数组和值类型,但绝对不能共享指针。
答案 1 :(得分:2)
你在这里误解了两个不同的概念 - 在这个意义上,dll正在共享内存,所有不会(永远)改变的东西都是共享的(物理的)。它节省了你的RAM,导致DLL中的大量数据是代码和其他常量数据,所以系统只使用它的一个副本,无论有多少进程使用它。这在系统级别很重要 - 从应用程序的角度来看,根本没有可见的共享。
但是,此处描述的内部数据不会在进程间共享 - 每个进程都有自己的副本。如果您对在进程之间共享内存感兴趣,则需要其他机制。您可能对Creating Named Shared Memory感兴趣。
答案 2 :(得分:0)
进程B将拥有自己独立的内存空间,与进程A无关。data
变量将在B的进程空间内创建。