Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1092729499
dolmat
2004-08-17 11:58
2004.09.12
Месяц и год


14-1093377531
lak
2004-08-24 23:58
2004.09.12
никто не слышал что ли?


6-1089041475
Don
2004-07-05 19:31
2004.09.12
Расшарить диск


3-1092649459
Alek
2004-08-16 13:44
2004.09.12
По поводу выборок


14-1093105357
Черный прапор
2004-08-21 20:22
2004.09.12
Сталкивались ли вы с переводом ресурсов (локализацией)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский