GlobalAllocPtr () всегда возвращает один и тот же адрес для разных процессов - PullRequest
3 голосов
/ 07 июня 2011

У меня есть приложение, которое можно запускать несколько раз одновременно в Windows.

В этом приложении в начале мы вызываем GlobalAllocPtr () для выделения памяти, как показано ниже:

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

Мы тестировали на двух машинах (оба XP Professional 2002, одна SP2, другая SP3) но на SP3 наши приложения будут зависать случайно

После расследования мы обнаружили:

  1. в SP3, GlobalAllocPtr() всегда возвращает один и тот же адрес для разных процессов приложения
  2. но на SP2 все нормально, возвращайте разные адреса для каждого процесса

Возможно ли, что GlobalAllocPtr(), возвращающий тот же адрес в WinXP SP3, будет прямой или косвенной причиной нашего сбоя?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 07 июня 2011

В течение последних 15 лет или более каждая нормальная ОС использовала виртуальную память. Каждый процесс получает полное виртуальное адресное пространство для себя . Таким образом, два разных процесса могут иметь указатели на один и тот же адрес без каких-либо проблем или конфликтов. Они никогда не видят данные друг друга, потому что у каждого из них есть своя «копия» этого адреса и каждого другого адреса.

Так работает ОС, и если вы не пишете драйвер режима ядра, вам не нужно знать, каковы основные физические адреса, и вы, как правило, не знаете что базовые физические адреса:

И нет, это не приводит к сбоям. Твоя проблема в другом.

4 голосов
/ 07 июня 2011

Управление памятью перенесено из 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...