Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Long strings в record ах, применение Initialize и Finalize   Найти похожие ветки 

 
HydraMarat   (2004-08-29 16:53) [0]

Здравствуйте! Опять я со своими 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) и вроде работало, но потом вновь повторились "обломы".

Спасибо.


 
jack128 ©   (2004-08-29 17:06) [1]


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

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


 
GuAV ©   (2004-08-29 17:09) [2]

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


 
GuAV ©   (2004-08-29 17:14) [3]


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

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


 
HydraMarat   (2004-08-29 17:33) [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.


 
jack128 ©   (2004-08-29 17:43) [5]


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


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

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


 
GuAV ©   (2004-08-29 19:30) [7]


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


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


> TRecA = array of TRec1;

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.055 c
1-1093136182
массив
2004-08-22 04:56
2004.09.12
Почему нельзя сделать строкой динамический массив ?


3-1092729499
dolmat
2004-08-17 11:58
2004.09.12
Месяц и год


1-1092852228
JUS
2004-08-18 22:03
2004.09.12
Подскажите плиз, как сделать,чтоб при наведении на ComboBox1 он о


1-1093113718
Арр'акктур
2004-08-21 22:41
2004.09.12
гибрид TTreeView с TListView


3-1092144875
Andrey
2004-08-10 17:34
2004.09.12
Экспорт БД