Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

выделение памяти: VirtualAlloc => MapViewOfFileEx

12K
18 июля 2005 года
SemenSemen
1 / / 18.07.2005
Необходимо изначально работать с блоком памяти (не только по соображениям производительности), и при определенных условиях (когда таких блоков становится "слишком много") этот блок памяти поместить в файл и работать дальше с маппированным в память файлом. Можно ли гарантированно маппировать тот блок данных, что был в памяти, (а сейчас в файле) на тот же (использованный ранее) виртуальный адрес?
По документации - используя 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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог