Текущий архив: 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.49 MB
Время: 0.01 c