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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

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

Сообщение ssnakess » 04.09.2023 03:14:02

объявлено
var p:Pointer;

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

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

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

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

Сообщение Дож » 04.09.2023 07:30:10

Можно попробовать использовать MemSize https://www.freepascal.org/docs-html/rt ... msize.html

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

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

Сохранить в свою переменную размер.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение Снег Север » 04.09.2023 09:23:06

Ручное выделение памяти - самый надежный способ "выстрелить себе в ногу" и заиметь постоянный геморрой. Единственное, где такое оправдано - интерфейсы с сишными библиотечными функциями.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3038
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение ssnakess » 04.09.2023 10:41:36

Снег Север писал(а): Снег Север » 04.09.2023 09:23:06

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

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

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

Сообщение zub » 04.09.2023 11:00:35

выше написали про MemSize, но будет с учетом особенностей менеджера памяти
Нужно пересматривать архитектуру - сам запоминай сколько выделил и используй
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 06.09.2023 16:16:37

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

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


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru