![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер выделенный под 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