![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно удалить запись содержащюю дин. массивы [D7, Win95/98, WinXP]
Kolan © (2005-10-01 12:31:00)Здравствуйте,
ПРи завершении программы я удаляю массив состояший из записей:
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)?
GuAV (2005-10-01 14:15:00) [1]
> Как правильно удалить запись содержащюю дин. массивы
если запись отдельно создаётся динамически (через указатель), то
Dispose
или (не рекмендуется, н всё же)
Finalize+ не-Dispose удаление (FreeMem например).
Запись выделенная как элемент динамического массива, поле класса, глобальная или локальная переменная (не через указатель) удаляется автоматически.
begin...end (2005-10-01 13:14:00) [2]> Kolan © (01.10.05 12:31)
> Или надо делать всем дин массивам SetLength(M, 0)?
Не надо.
TUser (2005-10-01 13:01:00) [3]А FMeasurments - это массив указателей? Значит ты ему длину сделал, а память выделил не под все записи.
> И вроде разницы нет никакой
Значит есть.
Kolan (2005-10-01 12:52:00) [4]Дело в том что, если я загружаю запись из файла то всё нормально, а если заполняю с прибора, то в выделленной строке получаю 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 12:46:00) [5]Надо.
Собственно говоря, при завершении работы программы память и так высвободится - это задача системы. Но лучше все-таки правильно написать освобождение памяти в деструкторе, т.к. при последующем использовании написанного однажды класса его освобождение может потребоваться до окончания работы программы.