Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.034 c
3-1092742537
Эдик Дятлов
2004-08-17 15:35
2004.09.12
Как получить подключенных пользователей в базе SQL Anywhere


4-1091029105
Anik
2004-07-28 19:38
2004.09.12
Как достать из JPEG Exif через Windows API?


8-1087845550
miek
2004-06-21 23:19
2004.09.12
Обновление SpriteUtils-2


1-1092302454
GrayFace
2004-08-12 13:20
2004.09.12
Алгоритмы сортировки


6-1088927693
Интересующийся
2004-07-04 11:54
2004.09.12
TServerSoket -> TProxySoket




   Наверх