我有一个可以在Windows上同时启动多次的应用程序。
在这个应用程序中,我们在开始时调用GlobalAllocPtr()来分配一个内存,如下所示:
// allocate a structure
LPSlcDataMgr lpMgr = (LPSlcDataMgr)GlobalAllocPtr(GHND, sizeof(TSlcDataMgr));
我们在两台机器上测试过(两者都是XP专业版2002,一台是SP2,另一台是SP3) 但在SP3上,我们的应用程序将随机崩溃
经过调查,我们发现:
GlobalAllocPtr()
始终为不同的应用程序进程返回相同的地址在WinXP SP3上返回相同地址的GlobalAllocPtr()
是否可能是我们崩溃的直接或间接原因?
提前致谢。
答案 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