Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.013 c
15-1152078978
Ega23
2006-07-05 09:56
2006.07.30
С Днём рождения! 5 июля


15-1151516366
TUser
2006-06-28 21:39
2006.07.30
Диск или контроллер?


3-1148876416
apl
2006-05-29 08:20
2006.07.30
Английские символы


15-1151394901
MsGuns
2006-06-27 11:55
2006.07.30
Слава сб.Украины по футболу !


2-1152634610
FBI Agent
2006-07-11 20:16
2006.07.30
Проблема с языком ввода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский