c++ - 使用 MapViewOfFile 创建共享内存块,然后在该 block 上放置新的类对象?

标签 c++ winapi shared-memory

我使用函数 CreateFileMapping MapViewOfFile UnmapViewOfFile 在磁盘上创建一个共享 block 。我可以在此 block 上放置新的类对象吗?


我使用 VS2003 IDE。

try
{
    Sphere *pData = m_pBVH->GetFirstHalfData();
    Sphere *p = new(pData)Sphere(center, radius, index);
}
catch (std::exception& e)
{
    // Can't catch
}

放置新错误:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

Debug 模式下,placement new 运算符可能会导致语法错误。可能是因为上面的代码,注释掉再试一次!

Release 模式下,没问题,但抛出不是std::bad_alloc 的异常,不知道是哪一个。也许共享内存的构建方式有些问题。我的共享内存创建代码如下:

CBVHVertexBuffer::CBVHVertexBuffer(const CString &file, unsigned int size)
{
    this->file = file;
    this->size = size;

    fileHandle = INVALID_HANDLE_VALUE;
    mapHandle = INVALID_HANDLE_VALUE;
    mapLength = 0;

    start = NULL;
    end = NULL;
    head = NULL;
    tail = NULL;

    fileHandle = ::CreateFile(
        file,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_DELETE_ON_CLOSE,
        NULL);
    if (fileHandle != INVALID_HANDLE_VALUE) 
    {
        //::SetFilePointer(fileHandle, size * pickingVertexSize, NULL, FILE_BEGIN);
        //::SetEndOfFile(fileHandle);
        //mapLength = ::GetFileSize(fileHandle, NULL);
        //mapLength = size * pickingVertexSize;
        mapHandle = ::CreateFileMapping(fileHandle, NULL, PAGE_READWRITE, 0, size * pickingVertexSize, NULL);
        mapLength = ::GetFileSize(fileHandle, NULL);
        start = (Sphere*)::MapViewOfFile(mapHandle, FILE_MAP_WRITE, 0, 0, 0);
    }

    end = start + size;

    Clear();
}

最佳答案

我建议只在映射文件中使用普通旧数据 (POD),因为在映射和取消映射文件时指针可能会变得无效

关于c++ - 使用 MapViewOfFile 创建共享内存块,然后在该 block 上放置新的类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17082403/

相关文章:

python - 为什么在与字符串共享 ctypes.Structure 与仅使用字符串时,子进程(python 多处理)的内存使用量如此不同?

python - 为什么 multiprocessing.sharedctypes 赋值这么慢?

c++ - 除了栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储?

c++ - Windows 运行中的目录搜索如何工作?

c++ - 用户禁用的启动位置中的 WinAPI 和程序

c++ - 打开文件以在 C++ 中显示内容

c - 共享内存未同步更新

传递参数的c++内存初始化

c++ - 如何构造非默认可构造对象的 std::vector ?

c++ - 如何指定继承类的构造函数定义?