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

Вниз

Размер выделенный под 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-92532
MV-GROB
2002-10-15 20:39
2002.10.28
не работает последняя функция


1-92454
John Magic
2002-10-18 08:07
2002.10.28
Вставка рисунка по ходе текста


1-92595
Slexx
2002-10-17 08:20
2002.10.28
интерфейс


1-92517
ev
2002-10-17 20:43
2002.10.28
как сделать TStringGrid и TListBox со скролом справа?


3-92403
Эрик
2002-10-08 12:33
2002.10.28
Опять Навиготор :)