Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Long strings в record'ах, применение Initialize и Finalize [D7, WinXP]


HydraMarat ©   (2004-08-29 16:53:00) 

Здравствуйте! Опять я со своими pointer'ами...

Есть типы:

type
 PRec1 = ^TRec1;
 TRec1 = record
   R: Integer;
   V: string;
 end;

 PRecA = ^TRecA;
 TRecA = array[0..MaxListSize - 1] of TRec1;

Если верить справке Delphi, то при использовании LongString'ов в структурах, память которых выделяется через GetMem и ReallocMem (именно так резервируется память под массив) необходимо использовать Initialize. Ну да, без нее иногда глючит. Но вот я подумал: раз я "инициализирую", то нужно и "файнализировать", то бишь вызывать Finalize перед FreeMem. Но... тогда возникает ошибка! А без Finalize работает. Может я чего не допонял.

Кстати, пробовал инициализировать через FillChar (имитировал "локальный" AllocMem) и вроде работало, но потом вновь повторились "обломы".

Спасибо.


GuAV   (2004-08-29 19:30:00) [1]


> Заранее размер неизвестен


> GuAV ©   (29.08.04 17:14) [3]


> TRecA = array of TRec1;

это динамический массив. почему бы и нет.


HydraMarat   (2004-08-29 17:50:00) [2]

Мда... почитал тут исходники в папке Source и походу все так грустно... Но почему же при Finalize ошибка? Ладно, буду разбираться дальше. Если че еще спрошу... А пока: Спасибо.


jack128   (2004-08-29 17:43:00) [3]


> Там перед присвоением значения вначале строке как указателю
> присваивают nil.
именно. На текущий момент Initialize - это заполнение нулями. но файналйз по любому делать надо - иначе у тя мемлик будет. В крайнем случае перед FreeMem присваивай строке ''


HydraMarat   (2004-08-29 17:33:00) [4]

jack128 ©   (29.08.04 17:06) [1]
Ну код больно расбросанный и большой. Но суть такова: на элемент массива (это указатель на record) вызывается Initialize, перед разрушением массива на этот же элемент вызывается Finalize. Интересно, что сами Finalize'ы работают корректно! Оишбка возникает уже когда часть кода с Finalize'ами пройдена. Исключение: EAccessViolation.

GuAV ©   (29.08.04 17:14) [3]
New и Dispose не применимы. Заранее размер неизвестен, поэтому приходится постоянно ReallocMem использовать.

Я посмотрел как подобная штука реализована в TSrtingList. Там перед присвоением значения вначале строке как указателю присваивают nil.


GuAV   (2004-08-29 17:14:00) [5]


> Если дин массив, то так и пиши.

я про то, почему бы не
TRecA = array of TRec1;


GuAV   (2004-08-29 17:09:00) [6]

А может не нужно через тот проход делать?
Для единичных записей New/Dispose. Тогда Initialize/Finalize не надо.
Если дин массив, то так и пиши.
А ваще подумай классы юзать.


jack128   (2004-08-29 17:06:00) [7]


> то нужно и "файнализировать", то бишь вызывать Finalize
> перед FreeMem.
Абсолютно верно.

> Но... тогда возникает ошибка!
код в студию. Какая именно ошибка.


Наверх

Титульная страница Поиск, карта сайта Написать письмо