Главная страница
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.031 c
2-1127977419
V-A-V
2005-09-29 11:03
2005.10.23
Помогите разобраться с запросом


11-1109577063
Интересующийся
2005-02-28 10:51
2005.10.23
KOLMouseDown: как заставить реагировать на нажатие кнопок мыши?


14-1128112246
LordOfRock
2005-10-01 00:30
2005.10.23
Вот я скажу насчёт классики...


6-1120014063
vidiv
2005-06-29 07:01
2005.10.23
sniffer


6-1120275384
Интиресующийся
2005-07-02 07:36
2005.10.23
TServerSocket!