Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.027 c
15-1151339690
X9
2006-06-26 20:34
2006.07.30
Symantec Antivirus CE 10 - проблемы


4-1145132365
Antonyan
2006-04-16 00:19
2006.07.30
Проблема с Async Professional


1-1150446834
lexer
2006-06-16 12:33
2006.07.30
Свойство компонента показать как TColorBox


6-1142577170
Dust
2006-03-17 09:32
2006.07.30
Ничего не могу понять.... :(


15-1151784673
kolyann..
2006-07-02 00:11
2006.07.30
help!!!




   Наверх