2011-12-27 2 views
0

Я пишу диспетчер памяти для Windows на C++. Я создал класс, который выделяет память и передает ее клиенту как void *. Я переопределяю новые и удаляю операторы для использования моего распределителя.Передача выделенной памяти с использованием карты памяти

__forceinline void * operator new(size_t n) 
{ 
    EnterCriticalSection(&CriticalSection); 
    void *ret = Heap.Alloc(n); 
    LeaveCriticalSection(&CriticalSection); 
    return ret; 
} 

Существует несколько потоков, которые обращаются к процессу распределителя с запросом на некоторый объем памяти. Есть ли возможность передать эту выделенную память с помощью карты памяти или что-то в этом роде, чтобы иметь возможность передавать память между процессами? Есть ли способ просто передать void * в другой процесс, чтобы использовать выделенную память там?

ответ

1

Вы не можете просто передать void*, поскольку каждый процесс имеет собственное адресное пространство, а адрес в одном не имеет смысла в другом. Have a look at this question, он, как представляется, отвечает вашим потребностям

1

Использование карты памяти - это правильный способ совместного использования блока памяти между процессами. Посмотрите на функции CreateFileMapping() и MapViewOfFile(). Дайте вашей карте памяти уникальное имя, которое оба процесса определяют при вызове CreateFileMapping().

Вы не можете передать указатель между процессами. Указатель является локальным для адресного пространства вызывающего процесса. Различные процессы имеют свои собственные адресные пространства. Однако, если void* поддерживается картой памяти, то оба процесса могут получить доступ к общей памяти путем сопоставления их собственных локальных указателей void* с той же именованной картой памяти. Затем вы можете передавать смещения в этой памяти вперед и назад между вашими процессами по мере необходимости, и они могут применять эти смещения к своим локальным указателям для доступа к тем же данным.

Смежные вопросы