簡體   English   中英

GlobalAllocPtr() 總是為不同的進程返回相同的地址

[英]GlobalAllocPtr() always return same address for different Process

我有一個可以在 Windows 上同時啟動多次的應用程序。

在這個應用程序中,一開始,我們調用 GlobalAllocPtr() 來分配一個 memory,如下所示:

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

我們在兩台機器上測試過(都是XP Professional 2002,一台是SP2,另一台是SP3)但是在SP3上,我們的應用程序會隨機崩潰

經過調查,我們發現:

  1. 在 SP3 上, GlobalAllocPtr()始終為不同的應用程序進程返回相同的地址
  2. 但在 SP2 上,沒關系,為每個進程返回不同的地址

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

提前致謝。

在過去 15 年或更長時間里,每個健全的操作系統都使用虛擬 memory。 每個進程都獲得了自己的完整虛擬地址空間。 因此,兩個不同的進程可以擁有指向同一個地址的指針,而不會出現任何問題或沖突。 他們永遠不會看到彼此的數據,因為他們每個人都有自己的那個地址的“副本”,以及每個其他地址。

這就是操作系統的工作原理,除非您正在編寫內核模式驅動程序,否則您不需要知道底層物理地址是什么,而且您通常也不知道底層物理地址是什么。

不,這不會導致崩潰。 你的問題是別的。

Memory 管理已從 Windows 3.1 轉移:

Windows memory 管理不提供單獨的本地堆和全局堆。 因此,GlobalAlloc 和 LocalAlloc 函數本質上是相同的。

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

閱讀有關在進程之間創建共享 memory 的文件映射部分,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM