类似于 mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);在 windows

analogy to mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in windows

我正在尝试将一些 linux C++ 移植到 windows 并且卡在了这样的一行

void* ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

我发现这是一种动态分配内存的方法,因为文件描述符是 -1。

如何在 windows 中执行此操作?我在文档中找不到任何可以在没有文件处理程序的情况下使用 MapViewOfFile 的内容。

MapViewOfFile不带文件句柄,带文件映射句柄。要分配内存块,您可以创建一个匿名文件映射,如下所示:

::DWORD const bytes_count_to_map{4u * 1024u * 1024u};
auto const h_mapping
{
    ::CreateFileMappingW
    (
        INVALID_HANDLE_VALUE        // not binded to actual file
    ,   nullptr                     // default security
    ,   PAGE_READWRITE | SEC_COMMIT // access flags
    ,   0u                          // map high
    ,   bytes_count_to_map          // map low
    ,   nullptr                     // no name
    )
};
if(NULL == h_mapping)
{
    auto const last_error{::GetLastError()};
    // TODO deal with error...
    exit(-1);
}
auto const p_view
{
    ::MapViewOfFile
    (
        h_mapping                      // mapping handle
    ,   FILE_MAP_READ | FILE_MAP_WRITE // map flags
    ,   0                              // offset high
    ,   0                              // offset low
    ,   bytes_count_to_map             // size
    )
};
if(nullptr == p_view)
{
    auto const last_error{::GetLastError()};
    // TODO deal with error...
    exit(-2);
}
if(FALSE == ::UnmapViewOfFile(p_view))
{
    auto const last_error{::GetLastError()};
    // TODO deal with error...
    exit(-3);
}
if(FALSE == ::CloseHandle(h_mapping))
{
    auto const last_error{::GetLastError()};
    // TODO deal with error...
    exit(-4);
}