выделение памяти: VirtualAlloc => MapViewOfFileEx
По документации - используя VirtualAlloc для памяти, а потом (после освобождения памити - VirtualFree) передав тот же адрес в MapViewOfFileEx, гарантий вроде нет, что удастся маппировать по запрошенному адресу, т.к. указанный регион памяти может оказаться уже занятым (приложение - многопоточное)...
Вопрос поясню схематично:
// Выделяем область памяти
char* pAddr = (char*)::VirtualAlloc( NULL, nSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
// Работаем с регионом памяти...
::memcpy(pAddr, pSomeExternalAddr, nSomeSize);
//...
//Создаем файл и пишем в него регион памяти...
HANDLE hFile = ::CreateFile(
szFileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
::WriteFile(hFile, pAddr, nSize, ...);
hMap = ::CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
nSize,
szMappingName);
::VirtualFree(pAddr, nSize, MEM_DECOMMIT);
char* pNewAddr = (char*)::MapViewOfFileEx(
hMap,
FILE_MAP_WRITE,
0,0,
nSize,
pAddr);
...
Проблема в том, что в приведенной схеме нет гарантий, что регион памяти pAddr, выделенный ранее с помощью VirtualAlloc, и овобожденный затем, останется свободным при попытке маппирования файла по его адресу pAddr.