Страница 1 из 1

Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 04.09.2023 03:14:02
ssnakess
объявлено
var p:Pointer;

в программе выделяю
GetMem(p,1024);

Как узнать сколько памяти выделено под P ?
SizeOf(p) выдает естественно 8, т.к. P это ссылка
SizeOf(p^) выдает 0

Добавлено спустя 5 минут 36 секунд:
непонятно, ибо если я освобождаю память выделенную под P
FreeMem(p);
то где-то же оно знает что надо освободить выделенные ранее 1024 байта!
т.е. вопрос, а как же мне тогда в программе узнать, сколько там выделено памяти?

Re: Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 04.09.2023 07:30:10
Дож
Можно попробовать использовать MemSize https://www.freepascal.org/docs-html/rt ... msize.html

Но на практике я бы не рекомендовал активно ею пользоваться, т.к. в случае нестандартного менеджера памяти она может работать неправильно, а кроме того менеджер может выделять память с запасами и выравниванием, и тогда возвращённое значение будет отличаться от того, что было передано в GetMem.

т.е. вопрос, а как же мне тогда в программе узнать, сколько там выделено памяти?

Сохранить в свою переменную размер.

Re: Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 04.09.2023 09:23:06
Снег Север
Ручное выделение памяти - самый надежный способ "выстрелить себе в ногу" и заиметь постоянный геморрой. Единственное, где такое оправдано - интерфейсы с сишными библиотечными функциями.

Re: Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 04.09.2023 10:41:36
ssnakess
Снег Север писал(а): Снег Север » 04.09.2023 09:23:06

Ручное выделение памяти - самый надежный способ "выстрелить себе в ногу" и заиметь постоянный геморрой. Единственное, где такое оправдано - интерфейсы с сишными библиотечными функциями.

Может быть, но как тогда объяснить, что GetMem встречается в 390 файлах, в каталоге /usr/share/fpcsrc
Не у верен что разработчики дружно решили "выстрелить себе в ногу" :)
Не надо Холиварить :)

Re: Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 04.09.2023 11:00:35
zub
выше написали про MemSize, но будет с учетом особенностей менеджера памяти
Нужно пересматривать архитектуру - сам запоминай сколько выделил и используй

Re: Как узнать сколько памяти выделено под pointer

СообщениеДобавлено: 06.09.2023 16:16:37
Alex2013
В простейшем виде GetMem(p,1024); понятное дело узнать размер не выйдет никак ("куча" (англ. heap) от того и называется кучей, что отслеживает только свободное место )
Можно просто сделать свою процедуру My_ GetMem(и My_FreeMem) и самостоятельно поддерживать список размеров привязанных к указателю.

Еще есть изрядно "кривой" вариант с использованием вместо указателей строчных переменных (задавая размер SetLenght (s,1024) (или более модно S:=String.Create(",1024) или S:=StringOfChar(' ',1024))и присваивая P:=@S[1] ) в этом случае Lenght (s) вернет размер, но это в любом, случае лишняя структура ( строчная переменная ) ссылку на которую нужно где-то хранить). У него есть свои преимущества однако там целая груда "подводных камней".