Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.133 c
4-1124353939
HardTouch
2005-08-18 12:32
2005.10.23
Идентификация окон


4-1124713454
Delphi_is_cool
2005-08-22 16:24
2005.10.23
Как установить интервал таймера 1 микросекунда


1-1127991488
r9000
2005-09-29 14:58
2005.10.23
Перевод части текста программы на fox в Delphi.


3-1126123296
Alpine
2005-09-08 00:01
2005.10.23
Нужно чделать отбор выделенных записей !


14-1128316417
Ega23
2005-10-03 09:13
2005.10.23
С днем рождения! 2 октября