Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер выделенный под Pointer [D5, D6, Win95/98, Win2k]


Mirovodin ©   (2002-10-16 12:01:00) 

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

Var
P: Pointer;
...

GetMem(P, 1000 );

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

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


Alx2   (2002-10-16 16:02:00) [1]

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


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

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


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

>Mirovodin

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

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


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

2 Alx2

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


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

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

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


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

Alx2 © (16.10.02 12:49)

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


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

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

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


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

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

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-х байтовой границе


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

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


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



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


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

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


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

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

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

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

Это как ?

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо