我使用CreateFileMapping
创建了一个共享内存,并使用MapViewOfFile
获取了一个视图:
HANDLE hMappedFile =
CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, DWORD(nSharedMemorySize), L"some-file-identifier")
void* lpViewOfData = MapViewOfFile(m_hMappedFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
然后我将lpViewOfData
投射到unsigned int *
unsigned int *address= reinterpret_cast<unsigned int *>(lpViewOfData)
写入address
时,进程崩溃
for(size_t i=0; i<len; ++i){ // len is not out-of-rangle
address[i] = i;
}
我用windbg转储了内存,并在共享内存中得到了一些??
,这意味着根据?? in memory locations的未映射地址。
000001c7`47bc0ff0 00000b18 00000b1a 00000c79 00000b1a
000001c7`47bc1000 ???????? ???????? ???????? ????????
...// bad
000001c7`47bc1ff0 ???????? ???????? ???????? ????????
000001c7`47bc2000 00000000 00000000 d3304ef3 10f7808e
...
... // good
...
000001c7`47c2eff0 47c2f000 000001c7 00000000 00000000
000001c7`47c2f000 ???????? ???????? ???????? ????????
... // bad
000001c7`47c2fff0 ???????? ???????? ???????? ????????
000001c7`47c30000 00000000 00000000 c5305ef5 0101c17e
如上所示,这些??
个区域的长度正好为4k
个字节。
我想知道导致此问题的可能原因,这是否意味着硬盘错误或对这些内存的错误操作(其他线程释放了这些区域)?