【问题标题】:Pass allocated memory using memory map使用内存映射传递分配的内存
【发布时间】:2012-01-28 16:16:02
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您不能只传递void*,因为每个进程都有自己的地址空间,其中一个地址在另一个中没有意义。 Have a look at this question,看来满足你的需求了

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 2023-03-03
        • 2015-01-26
        • 2012-07-07
        • 2021-09-05
        • 2017-06-08
        相关资源
        最近更新 更多