MapViewOfFile returns 具有相同句柄的不同地址

MapViewOfFile returns different addresses with same handle

我正在尝试通过共享内存为学校作业实施 IPC。 我制作了一个名为 SharedMemoryBuffer 的 class 来处理创建文件映射和视图。

我的 Init() 函数如下所示:

BYTE * SharedMemoryBuffer::Init(const wchar_t * name, size_t bufferSize)
{

    FileMapHandle = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        name);               // name of mapping object

    if (FileMapHandle == NULL)
    {
        FileMapHandle =
            CreateFileMapping(INVALID_HANDLE_VALUE,
                NULL,
                PAGE_READWRITE,
                0,
                bufferSize,
                name);

        pBuf = (BYTE*)MapViewOfFile(FileMapHandle, // handle to map object
            FILE_MAP_ALL_ACCESS,  // read/write permission
            0,
            0,
            bufferSize);
    }
    else
    {
        pBuf = (BYTE*)MapViewOfFile(
            FileMapHandle,
            FILE_MAP_ALL_ACCESS,
            0,
            0,
            bufferSize
        );
    }
    return this->GetBuffer();
}

基本上,我将名称和大小传递给它,它会尝试打开具有此名称的映射。如果失败,则改为创建它。

我是这样称呼它的 this->ringBuffer.Init(widestr.c_str(), buffSize);

完成后(我从同一进程为 2 个缓冲区调用 Init 4 次)我打印出缓冲区的地址(pBuf 来自 Init())但它们都是不同的地址.

我无法理解为什么地址会不同! 我已确保我第二次使用相同的名称调用 Init(),它确实成功打开了文件映射。

来源:https://github.com/RavioliFinoli/SharedMemory

您在进程中两次映射同一区域。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是相同的内存。