GlobalAllocPtr()始终为不同的Process返回相同的地址

时间:2011-06-07 00:56:16

标签: c++ windows winapi

我有一个可以在Windows上同时启动多次的应用程序。

在这个应用程序中,我们在开始时调用GlobalAllocPtr()来分配一个内存,如下所示:

// allocate a structure
LPSlcDataMgr lpMgr = (LPSlcDataMgr)GlobalAllocPtr(GHND, sizeof(TSlcDataMgr));

我们在两台机器上测试过(两者都是XP专业版2002,一台是SP2,另一台是SP3) 但在SP3上,我们的应用程序将随机崩溃

经过调查,我们发现:

  1. 在SP3上,GlobalAllocPtr()始终为不同的应用程序进程返回相同的地址
  2. 但在SP2上,没关系,为每个进程返回不同的地址
  3. 在WinXP SP3上返回相同地址的GlobalAllocPtr()是否可能是我们崩溃的直接或间接原因?

    提前致谢。

2 个答案:

答案 0 :(得分:6)

在过去的15年或更长时间里,每个理智的操作系统都使用了虚拟内存。每个进程都会获得一个完整的虚拟地址空间到自身。因此,两个不同的进程可以指向同一地址,没有任何问题或冲突。他们从不会看到彼此的数据,因为他们每个人都有自己的“副本”和其他地址。

这就是操作系统的工作原理,除非您正在编写内核模式驱动程序,否则您不需要知道底层物理地址是什么,并且您通常不知道底层物理地址是什么。

不,这不会导致崩溃。你的问题是另一回事。

答案 1 :(得分:4)

内存管理已从Windows 3.1开始:

  

Windows内存管理没有   提供一个单独的本地堆和   全局堆。因此,   GlobalAlloc和LocalAlloc功能   基本上是一样的。

http://msdn.microsoft.com/en-us/library/aa366574(VS.85).aspx

阅读有关在进程之间创建共享内存的文件映射部分,

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx