![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определить размер буфера по указателю. Возможно? [D5, D7, Win2k, WinXP]
Dust © (2006-06-19 19:50:00)Уважаемые мастера. Подскажите, возможно ли определить размер блока памяти по указателю. Память выделялась функцией AllocMem();
Дмитрий Белькевич (2006-06-22 01:40:00) [1]>Удалять - это одно, гораздо интереснее копировать и использовать эту самую память, например, если есть довольно большой список с указателями, программа получается неско сложнее если сохранять ещё и размер (а именно так я в итоге и сделал), именно поэтому меня интересовали штатные, или нештатные методы определения размера блока.
Так. Отделим мухи от котлет. Копировать память не нужно, т.к. не получится. Копировать данные - другое дело. Копировать зачем? Что бы их затем менять? Опять же, есть много мелких блоков, или несколько больших, или много больших? Все размеры разные? Или блоки маленькие, и даже хранение их длины - уже избыточность. Группировать, например, никак не получиться?
Дмитрий Белькевич (2006-06-22 01:32:00) [2]>А разве возможно указать, сколько удалять
procedure FreeMem(var P: Pointer[; Size: Integer]);
Дмитрий Белькевич (2006-06-22 01:30:00) [3]>Тут, как обычно, фундаментальный вопрос, а вы так
а шо делать, мы всё о приземлённом ;)
jack128 (2006-06-21 18:23:00) [4]Dust © (21.06.06 15:36) [12]
большой список с указателями, программа получается неско сложнее если сохранять ещё и размер
размер чего? Блоков памяти, на которые указывают эти указатели? а зачем их хранить? Не храни, и программа станет проще..
Loginov Dmitry (2006-06-21 15:44:00) [5]Dust © (21.06.06 15:36) [12]
Функция FreeMem сама удаляет памяти ровно столько, сколько ее было выделено функиями FreeMem или AllocMem.
Dust (2006-06-21 15:36:00) [6]Удалять - это одно, гораздо интереснее копировать и использовать эту самую память, например, если есть довольно большой список с указателями, программа получается неско сложнее если сохранять ещё и размер (а именно так я в итоге и сделал), именно поэтому меня интересовали штатные, или нештатные методы определения размера блока.
palva (2006-06-21 10:45:00) [7]> Столько и удаляй.
А разве возможно указать, сколько удалять? Стандартными средствами удаляется именно столько, сколько было выделено.
Джо (2006-06-21 01:15:00) [8]> [9] Дмитрий Белькевич © (21.06.06 01:13)
> Вот вот, сам же выделял? Так знаешь же сколько выделял.
> Столько и удаляй.
Тут, как обычно, фундаментальный вопрос, а вы так :)
Дмитрий Белькевич (2006-06-21 01:13:00) [9]Вот вот, сам же выделял? Так знаешь же сколько выделял. Столько и удаляй.
jack128 (2006-06-20 12:36:00) [10]не понятно, нафиг те нужен этот размер??
Юрий Зотов (2006-06-20 07:44:00) [11]> Dust © (19.06.06 21:59) [4]
> в предыдущих четырёх байтах лежит что-то похожее на размер
Там действительно лежит размер, но не в чистом виде, а определенным образом скомбинированный с флагами данного блока памяти.
Юрий Зотов (2006-06-20 07:37:00) [12]> 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 байта используются для служебных целей).
begin...end (2006-06-19 22:23:00) [13]Штатных методов не будет.
Dust (2006-06-19 21:59:00) [14]в предыдущих четырёх байтах лежит что-то похожее на размер (если выделил 16000 то будет 16006), но всёже несколько не то, я думал будут штатные методы.
palva (2006-06-19 20:04:00) [15]А если посмотреть предыдущие 4 байта, может быть там лежит? Или подсмотреть под отладчиком, как работает FreeMem++
Dmitrij_K (2006-06-19 20:04:00) [16]Возможно, т.к. delphi где-то хранит размер буфера для освобождения функцией FreeMem
Desdechado (2006-06-19 19:57:00) [17]если указатель нетипизированный, то вряд ли