Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

Как правильно удалить запись содержащюю дин. массивы   Найти похожие ветки 

 
Kolan ©   (2005-10-01 12:31) [0]

Здравствуйте,
 ПРи завершении программы я удаляю массив состояший из записей:
 FMeasurments: array of PMeasurmentData;

Запись выглядит так:
 
 PMeasurmentData = ^TMeasurmentData;
 TMeasurmentData = record
   {OutPut}
   OutPutGraff: TArrayOfTPair;
   OutPutMeasurments: TArrayOfMeasurmentGrid;
   OutPutResAntiRes: TArrayOfTPair;
   OutPutName: string;
   OutPutCapacity: Double;

   {Future compatibility.}
   OutPutActiveGarff: TArrayOfTPair;

   {InPut}
   InPutRange: TArrayOfLongint;
   InPutFindResonanceRange: TArrayOfLongint;
   InPutStep: Single;
   InPutOperator: string;
   InPutDevice: string;
   InPutDateTime: TDateTime;
   InPutNumber: Integer;

   {}
   IsThisRecordFilled: Boolean;
   MeasurmentState: TMeasurmentStates;
   { 0 - MeasurmentNull;
     1 - Measurment in prosess, but data not ready.
     2 - Measurment in prosess, data is ready.
     3 - Measurment finished.
   }
   CurrentPosition: Longint;
   LastCalledPosition: Longint;
 end;


А удаляю так:

destructor TMeasurmentManager.Destroy;
var
 I: Integer;
begin
 for I := Low(FMeasurments) to High(FMeasurments) do
   Dispose(FMeasurments[I]);
 SetLength(FMeasurments, 0);
 inherited Destroy;
end;


Вопрос правильно ли я удаляю? Или надо делать всем дин массивам SetLength(M, 0)?


 
TUser ©   (2005-10-01 12:46) [1]

Надо.

Собственно говоря, при завершении работы программы память и так высвободится - это задача системы. Но лучше все-таки правильно написать освобождение памяти в деструкторе, т.к. при последующем использовании написанного однажды класса его освобождение может потребоваться до окончания работы программы.


 
Kolan ©   (2005-10-01 12:52) [2]

Дело в том что, если я загружаю запись из файла то всё нормально, а если заполняю с прибора, то в выделленной строке получаю Invalide Pointer Operation.

Это очень странно, тк в файл запись сохраняются измерения прибора. И вроде разницы нет никакой...

destructor TMeasurmentManager.Destroy;
var
I: Integer;
begin
for I := Low(FMeasurments) to High(FMeasurments) do
  Dispose(FMeasurments[I]);
SetLength(FMeasurments, 0);
inherited Destroy;
end;


Собственно говоря, при завершении работы программы память
Да если закоментить то проблем нет. Но я тут с MemProof разобрался а он мне сказал что так делать низя :)


 
TUser ©   (2005-10-01 13:01) [3]

А FMeasurments - это массив указателей? Значит ты ему длину сделал, а память выделил не под все записи.

> И вроде разницы нет никакой

Значит есть.


 
begin...end ©   (2005-10-01 13:14) [4]

> Kolan ©   (01.10.05 12:31)

> Или надо делать всем дин массивам SetLength(M, 0)?

Не надо.


 
GuAV ©   (2005-10-01 14:15) [5]


> Как правильно удалить запись содержащюю дин. массивы

если запись отдельно создаётся динамически (через указатель), то
Dispose

или (не рекмендуется, н всё же)
Finalize + не-Dispose удаление (FreeMem например).

Запись выделенная как элемент динамического массива, поле класса, глобальная или локальная  переменная (не через указатель) удаляется автоматически.



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

Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.034 c
6-1120196627
Dust
2005-07-01 09:43
2005.10.23
Сколько данных читать из неблокирующего сокета?


2-1127737453
Новичёк
2005-09-26 16:24
2005.10.23
Работа с DBF


14-1127992163
Coder_
2005-09-29 15:09
2005.10.23
Протокол ICQ


4-1124634715
menart
2005-08-21 18:31
2005.10.23
отображение миниатюры


14-1128359821
Kerk
2005-10-03 21:17
2005.10.23
[Эксперимент] Рафинад прессованный





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский