我使用函数 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/