【问题标题】:GlobalAllocPtr() always return same address for different ProcessGlobalAllocPtr() 总是为不同的进程返回相同的地址
【发布时间】:2011-09-09 17:16:58
【问题描述】:

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

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

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

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

经过调查,我们发现:

  1. 在 SP3 上,GlobalAllocPtr() 始终为不同的应用程序进程返回相同的地址
  2. 但是在SP2上没问题,为每个进程返回不同的地址

在 WinXP SP3 上返回相同地址的GlobalAllocPtr() 是否可能是我们崩溃的直接或间接原因?

提前致谢。

【问题讨论】:

标签: c++ windows winapi


【解决方案1】:

在过去 15 年或更长时间里,每个健全的操作系统都使用了虚拟内存。每个进程都有一个完整的虚拟地址空间给自己。因此,两个不同的进程可以拥有指向同一个地址的指针,而不会出现任何问题或冲突。他们永远不会看到彼此的数据,因为他们每个人都有自己的该地址的“副本”,以及其他所有地址。

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

不,这不会导致崩溃。你的问题是别的。

【讨论】:

  • 非常感谢,现在 VAS 对我来说很清楚了,我同意你的看法,应该在其他地方。
【解决方案2】:

内存管理从 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

【讨论】:

  • 您好,谢谢您的回复但是在我的情况下,我们不想在进程之间共享内存我们只需要每个进程自己的内存地址。
  • @michael.yue :每个进程都有自己的内存空间;给你的地址不是物理地址,而是虚拟地址。
  • @michael 所以只需使用并发运行时中的newmallocAlloc
  • @ildjam,来自 MSDN,它说:--->如果函数成功,返回值是指向内存块第一个字节的指针
  • @Steve-o,我们不能这样改,否则会对当前应用造成很大影响
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2012-05-27
  • 2016-02-24
  • 2018-02-20
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多