Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

VirtualAlloc с MEM_COMMIT   Найти похожие ветки 

 
guav ©   (2009-02-23 01:01) [0]

http://msdn.microsoft.com/en-us/library/aa366887.aspx
MEM_COMMIT
To reserve and commit pages in one step, call VirtualAlloc with MEM_COMMIT | MEM_RESERVE.

The function fails if you attempt to commit a page that has not been reserved. The resulting error code is ERROR_INVALID_ADDRESS.

Т.е. надо понимать, что всегда нужно MEM_RESERVE перед использованием MEM_COMMIT или во время использования MEM_COMMIT.


Что тогда делает такой вызов:
P := VirtualAlloc(nil, $40000, MEM_COMMIT, PAGE_READWRITE);?
(он успешен на всех проверенных системах).

Будет ли это то же, что
P := VirtualAlloc(nil, $40000, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
?


 
bems   (2009-02-23 01:58) [1]

Эксперимент показал что короткий ответ на этот вопрос: да.

Если подробнее, то вызовP := VirtualAlloc(nil, $40000, MEM_COMMIT, PAGE_READWRITE);успешен. Я вставил этот вызов в такое место в программе, где адрес выделеного блока получался всегда одинаковым (в моем случае $B80000)
Я переделал вызов такVirtualAlloc(pointer($B80000),$40000, MEM_COMMIT,PAGE_READWRITE);И вызов дал ошибку, в точности как и описано в вашей цитате из MSDN

А такой вариант вызоваVirtualAlloc(pointer($B80000),$40000, MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);отработал как нужно.

Поэтому длинный ответ получается примерно таким:
Если вы указываете адрем памяти, который хотите выделить, то функция щитает, что вы сами следите какие регионы у вас выделены, а какие просто зарезервированы. В этом случае она строго относится к флагам MEM_COMMIT и MEM_RESERVE, чтобы вы не могли поламать свою логику отслеживания состояний каждой страницы. Если же вам все равно, где будет начинаться выделяемый регион (вы указали nil первым аргументом), то это означает "просто дайте мне какой-нибудь памяти". И в этом случае MEM_RESERVE подразумевается.


 
guav ©   (2009-02-23 18:47) [2]

У меня такие же результаты.
Провёл более подробные тесты с первым параметром nil (включая занятие всего АП с последующим освобождением и повторным занятием другим способом и с проверкой смещений указателей), в общем можно считать, что да.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.081 c
15-1264517700
Nucer
2010-01-26 17:55
2010.08.27
Proxy сервер на 1000+ соединений на Delphi с исходным кодом


15-1275545924
Alx2
2010-06-03 10:18
2010.08.27
Задачка про максимальный столб из "черепах"


15-1273012753
Игорь
2010-05-05 02:39
2010.08.27
madCodeHook


15-1266928491
Кто б сомневался
2010-02-23 15:34
2010.08.27
Интернет убил «Убийцу» (защита от пиратства)


2-1268597076
semjuel
2010-03-14 23:04
2010.08.27
Создание сетевой БД Access