Форум: "Основная";
Текущий архив: 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.019 c