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

Вниз

Определить размер буфера по указателю. Возможно?   Найти похожие ветки 

 
Dust ©   (2006-06-19 19:50) [0]

Уважаемые мастера. Подскажите, возможно ли определить размер блока памяти по указателю. Память выделялась функцией AllocMem();


 
Desdechado ©   (2006-06-19 19:57) [1]

если указатель нетипизированный, то вряд ли


 
Dmitrij_K   (2006-06-19 20:04) [2]

Возможно, т.к. delphi где-то хранит размер буфера для освобождения функцией FreeMem


 
palva ©   (2006-06-19 20:04) [3]

А если посмотреть предыдущие 4 байта, может быть там лежит? Или подсмотреть под отладчиком, как работает FreeMem++


 
Dust ©   (2006-06-19 21:59) [4]

в предыдущих четырёх байтах лежит что-то похожее на размер (если выделил 16000 то будет 16006), но всёже несколько не то, я думал будут штатные методы.


 
begin...end ©   (2006-06-19 22:23) [5]

Штатных методов не будет.


 
Юрий Зотов ©   (2006-06-20 07:37) [6]

> Dust ©   (19.06.06 21:59) [4]

Покопавшись в исходниках VCL, такую функцию написать можно, и даже довольно легко. Но она будет использовать недокументированные вещи - то есть, запросто может получиться зависимой от разрядности платформы и от версии менеджера памяти. Вот работающий пример для Win32 и Delphi 7:
 
function GetMemBlockSize(const P: pointer): cardinal;
begin
 {$IF Defined(WIN32) and Defined(VER150)}
 Result := PInteger(Cardinal(P) - 4)^;
 if Result and 2 = 0 then
   raise EHeapException.CreateFmt("Memory by address %x is not allocated", [Cardinal(P)]);
 Result := Result and $7FFFFFFC - 4
 {$ELSE}
   Error: unsupported version
 {$IFEND}
end;

Функция возвращает размер реально выделенного блока памяти, расположенного по заданному адресу. Следует иметь в виду, что для Win32 и Delphi 7:
а). этот реально выделенный блок не может быть менее 8 байт;
б). его размер всегда кратен 4 с округлением в большую сторону;
в). на самом деле выделяется на 4 байта больше, чем показывает функция (эти 4 байта используются для служебных целей).


 
Юрий Зотов ©   (2006-06-20 07:44) [7]

> Dust ©   (19.06.06 21:59) [4]
> в предыдущих четырёх байтах лежит что-то похожее на размер

Там действительно лежит размер, но не в чистом виде, а определенным образом скомбинированный с флагами данного блока памяти.


 
jack128 ©   (2006-06-20 12:36) [8]

не понятно, нафиг те нужен этот размер??


 
Дмитрий Белькевич ©   (2006-06-21 01:13) [9]

Вот вот, сам же выделял? Так знаешь же сколько выделял. Столько и удаляй.


 
Джо ©   (2006-06-21 01:15) [10]

> [9] Дмитрий Белькевич ©   (21.06.06 01:13)
> Вот вот, сам же выделял? Так знаешь же сколько выделял.
> Столько и удаляй.

Тут, как обычно, фундаментальный вопрос, а вы так :)


 
palva ©   (2006-06-21 10:45) [11]

> Столько и удаляй.
А разве возможно указать, сколько удалять? Стандартными средствами удаляется именно столько, сколько было выделено.


 
Dust ©   (2006-06-21 15:36) [12]

Удалять - это одно, гораздо интереснее копировать и использовать эту самую память, например, если есть довольно большой список с указателями, программа получается неско сложнее если сохранять ещё и размер (а именно так я в итоге и сделал), именно поэтому меня интересовали штатные, или нештатные методы определения размера блока.


 
Loginov Dmitry ©   (2006-06-21 15:44) [13]

Dust ©   (21.06.06 15:36) [12]

Функция FreeMem сама удаляет памяти ровно столько, сколько ее было выделено функиями FreeMem или AllocMem.


 
jack128 ©   (2006-06-21 18:23) [14]

Dust ©   (21.06.06 15:36) [12]
большой список с указателями, программа получается неско сложнее если сохранять ещё и размер

размер чего? Блоков памяти, на которые указывают эти указатели? а зачем их хранить? Не храни, и программа станет проще..


 
Дмитрий Белькевич ©   (2006-06-22 01:30) [15]

>Тут, как обычно, фундаментальный вопрос, а вы так

а шо делать, мы всё о приземлённом ;)


 
Дмитрий Белькевич ©   (2006-06-22 01:32) [16]

>А разве возможно указать, сколько удалять

procedure FreeMem(var P: Pointer[; Size: Integer]);


 
Дмитрий Белькевич ©   (2006-06-22 01:40) [17]

>Удалять - это одно, гораздо интереснее копировать и использовать эту самую память, например, если есть довольно большой список с указателями, программа получается неско сложнее если сохранять ещё и размер (а именно так я в итоге и сделал), именно поэтому меня интересовали штатные, или нештатные методы определения размера блока.

Так. Отделим мухи от котлет. Копировать память не нужно, т.к. не получится. Копировать данные - другое дело. Копировать зачем? Что бы их затем менять? Опять же, есть много мелких блоков, или несколько больших, или много больших? Все размеры разные? Или блоки маленькие, и даже хранение их длины - уже избыточность. Группировать, например, никак не получиться?



Страницы: 1 вся ветка

Текущий архив: 2006.07.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
15-1151838597
vidiv
2006-07-02 15:09
2006.07.30
Сертификаты


6-1142871232
andrey_frik
2006-03-20 19:13
2006.07.30
UDP программа


15-1147385958
Fantasy
2006-05-12 02:19
2006.07.30
Delphi 10 Lite


2-1152717858
СерегаВЕБ
2006-07-12 19:24
2006.07.30
Не показывать форму на панели задач


2-1152266882
Diksa
2006-07-07 14:08
2006.07.30
Новая запись