Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c