Главная страница
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.048 c
3-1092733145
mouse_web
2004-08-17 12:59
2004.09.12
Query возвращение ID вставляемой записи


1-1092739951
Inco
2004-08-17 14:52
2004.09.12
Обновление приложения в рантайм.


3-1092639235
Руслан
2004-08-16 10:53
2004.09.12
ODA Error: пишет при создании dbf файла


1-1093709405
][ncognito
2004-08-28 20:10
2004.09.12
Сканирование директорий и файлов


3-1092810273
Belkova
2004-08-18 10:24
2004.09.12
Мастера Delphi! Подскажите, пожалуйста. В приложении из разных