Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

Непонятки с VirtualFree   Найти похожие ветки 

 
Islander   (2004-01-26 15:49) [0]

Здравствуйте.

Есть код:
----------

var
 P: PChar;
 S: String;
begin

 P:=VirtualAlloc(nil, n, MEM_COMMIT, PAGE_READWRITE);

// Какие-то действия с P, при этом n не меняется

 SetString (S, P, n);

 if not (VirtualFree(P, 0 , MEM_RELEASE )) then
   raise Exception.Create("Error calling VirtualFree function ("+
     inttostr (GetLastError())+")");
----

Так вот, мне надо ранее заалокированный буфер освободить для чего я вызываю VirtualFree.

Формат функции такой:

BOOL VirtualFree(

   LPVOID lpAddress, // address of region of committed pages  
   DWORD dwSize, // size of region
   DWORD dwFreeType  // type of free operation
  );

А затем сказано

lpAddress

Points to the base address of the region of pages to be freed. If the dwFreeType parameter includes the MEM_RELEASE flag, this parameter must be the base address returned by the VirtualAlloc function when the region of pages was reserved.

dwSize

Specifies the size, in bytes, of the region to be freed. If the dwFreeType parameter includes the MEM_RELEASE flag, this parameter must be zero. Otherwise, the region of affected pages includes all pages containing one or more bytes in the range from the lpAddress parameter to (lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes both pages to be freed.

Так как у меня третий параметр MEM_RELEASE, то мне по этому описанию надо задать параметр dwSize = 0, иначе надо указать количество байт.

Так вот интеремно, как это винда собирается освобождать буфер, при этом не зная его размер?! Попробовал все-таки указывать при флаге MEM_RELEASE явно размер буфера, но тогда функция постоянно возвращает false.


 
MBo ©   (2004-01-26 16:04) [1]

Система сама знает, какой размер был выделен для блока по переданному указателю.


 
Islander   (2004-01-26 16:06) [2]

Так PChar же это указатель длиною в 4 байта, указывающий на начальный участок памяти, а про конечный то в нем ничего не сказано!


 
MBo ©   (2004-01-26 16:15) [3]

при выделении блока памяти предназначенными для этого функциями перед ним записывается его длина.


 
MBo ©   (2004-01-26 16:17) [4]

>перед ним записывается его длина
Возможно, не всегда делается именно так, но по крайней мере менеджер памяти о размере знает


 
Islander   (2004-01-26 16:21) [5]

В первый раз слышу, что он хранится перед блоком памяти. А вот про менеджер памяти, это может быть...


 
MBo ©   (2004-01-26 16:25) [6]

В качестве примера - хелп по StrAlloc


 
YuRock ©   (2004-01-26 16:29) [7]

> перед ним записывается его длина

Да это Дельфя так делает в StrAlloc"е.
На самом деле размеры выделенной памяти хранятся в каких-нибудь таблицах (для того, чтобы можно было определить, что это за указатель).


 
YuRock ©   (2004-01-26 16:32) [8]

[7] - Я имел в виду - обычно


 
YuRock ©   (2004-01-26 17:01) [9]

В данном случае размер можно узнать с помощью  VirtualQuery



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

Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.046 c
3-1078372294
Genemy
2004-03-04 06:51
2004.04.04
cross-tab отчет в FR


3-1078958054
Vemer
2004-03-11 01:34
2004.04.04
Толщина ползунка в DBGrid - как отследить?


6-1075460579
Axe__
2004-01-30 14:02
2004.04.04
как можно изменить шлюз и днс сервер


6-1075145941
Magician
2004-01-26 22:39
2004.04.04
Как начать качать файл с определенного места


1-1079215766
Димка
2004-03-14 01:09
2004.04.04
Принтер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский