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

Вниз

Размер выделенный под Pointer   Найти похожие ветки 

 
Mirovodin   (2002-10-16 12:01) [0]

Как получить размер (в байтах) выделенный под Pointer. Например:

Var
P: Pointer;
...

GetMem(P, 1000 );

Как получить эту 1000 байт, если на стадии компиляции размер может изменяться?

Пробовал через GlobalSize(GlobalHandle(P)) на NT ломается.


 
Игорь Шевченко   (2002-10-16 12:16) [1]

Боюсь, что никак. Но могу и ошибаться. Лезть надо в Memory Manager


 
REA   (2002-10-16 12:22) [2]

А если sharemem то оно в dll


 
Digitman   (2002-10-16 12:30) [3]

>>размер (в байтах) выделенный под Pointer

в Win32 он всегда равен 4

>>если на стадии компиляции размер может изменяться

Это как ?

var
size: DWord;
..
size := 1000; // и чего его получать ? он и так известен
GetMem(P, size);


 
REA   (2002-10-16 12:34) [4]

уфф. утомился GetMem.inc смотреть. больно уж замороченный алгоритм. там может и не быть в самом блоке ссылки на размер и придется ходить по таблице блоков выиискивая свой указатель.


 
Alx2   (2002-10-16 12:39) [5]

Вот так, например:


procedure TForm1.Button1Click(Sender: TObject);
Var p : Pointer;
begin
GetMem(p,11111);
ShowMessage(IntToStr(Integer(Pointer(Integer(p)-4)^)));
FreeMem(p);
end;



Использование FreeMem(p) без указания размера приводит, тем не менее, к корректному освобождению памяти. Трассирвкой получаем, откуда сие берется.


 
Alx2   (2002-10-16 12:49) [6]

Сорри, еще кое-что надо вычислить.
Вот исправленный вариант:

procedure TForm1.Button1Click(Sender: TObject);
Var p : Pointer;
begin
GetMem(p,11111);
ShowMessage(IntToStr(Integer(Pointer((Integer(p)-4))^) and $7ffffffc - 4));
FreeMem(p);
end;




Следует учесть, что происходит выравнивание по 4-х байтовой границе


 
han_malign   (2002-10-16 13:23) [7]

Точно, еще добавлю
cThisUsedFlag = 2;
cPrevFreeFlag = 1;

BadPtr:=(Integer(Pointer(Integer(p)-4)^)and cThisUsedFlag)=0;
//Указатель отпущен.


 
Игорь Шевченко   (2002-10-16 13:59) [8]

Alx2 © (16.10.02 12:49)

Это будет зависеть от использования\неиспользования Sharemem ?


 
Alx2   (2002-10-16 14:02) [9]

>Игорь Шевченко © (16.10.02 13:59)

По-моему не будет.


 
Mirovodin   (2002-10-16 14:55) [10]

2 Alx2

Спасибо, с 4-х байтовой границей это дейсвительно так.
На Sharemem не влияет.


 
Digitman   (2002-10-16 15:30) [11]

>Mirovodin

Объясни мне, тундре, зачем тебе это надо ? В каких таких случаях это может понадобиться ?

Ну не знаю я таких задач, где без этого никак не обойтись ...


 
turusov   (2002-10-16 15:38) [12]

Это невозможно т.к. за указателем может прятаться и упакованная запись, вариантный массив, метод, объект и байт. Можно определить только зная, что ждете для получения.


 
Alx2   (2002-10-16 16:02) [13]

>turusov © (16.10.02 15:38)
Менджер памяти так устроен. Ведется подсчет и общей выделенной памяти и счетчик использования и, соответственно, количество памяти под конкретную дин. выделенную структуру. Сама структура ему по барабану - не его проблемы. Его дело - обеспечить нужным материалом.



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

Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.042 c
1-92450
Dasha
2002-10-18 05:17
2002.10.28
RX-Library


1-92421
Дмитрий К.К.
2002-10-17 07:57
2002.10.28
Поменять цвет любого оконного контрола


3-92347
Sergant
2002-10-06 05:00
2002.10.28
Не могу создать/добавить индекс в Firebird!!!


3-92374
alenka
2002-10-06 00:49
2002.10.28
Как реализовать каскадное удаление?


14-92720
lak_b
2002-10-08 15:25
2002.10.28
оффтопик





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский