Главная страница
    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.47 MB
Время: 0.008 c
14-92687
Doctor Snap
2002-10-07 19:59
2002.10.28
NTFS


4-92810
Mazenrat
2002-09-16 15:36
2002.10.28
IntToStr без модуля SysUtils.


1-92442
kukuikar
2002-10-17 21:04
2002.10.28
буду нагл до невозможности


1-92563
Mirovodin
2002-10-16 12:01
2002.10.28
Размер выделенный под Pointer


1-92481
AL2002
2002-10-17 18:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский