使用内存映射传递分配的内存

时间:2011-12-27 17:47:34

标签: c++ windows memory-management operating-system

我正在用c ++编写Windows内存管理器。我创建了一个分配内存的类,并将其作为void *传递回客户端。我已经覆盖了new和delete运算符来使用我的分配器。

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

有几个线程转向分配器进程需要一些内存。有没有可能使用内存映射或类似的东西传递这个分配的内存,以便能够在进程之间传递内存?有没有办法将void *传递给另一个进程以在那里使用已分配的内存?

2 个答案:

答案 0 :(得分:1)

使用内存映射是跨进程共享内存块的正确方法。查看CreateFileMapping()MapViewOfFile()函数。为您的内存映射提供一个唯一的名称,两个进程在调用CreateFileMapping()时指定。

您无法在进程之间传递void*指针。指针是调用进程的地址空间的本地指针。不同的进程有自己独立的地址空间。但是,如果void*由内存映射支持,则两个进程都可以通过将自己的本地void*指针映射到同一个命名的内存映射来访问共享内存。然后,您可以根据需要在进程之间来回传递该内存中的偏移量,并且可以将这些偏移应用于其本地指针以访问相同的数据。

答案 1 :(得分:1)

您不能只传递void*,因为每个进程都有自己的地址空间,而另一个进程中的地址没有任何意义。 Have a look at this question,它似乎满足了你的需要