Форум: "Основная";
Текущий архив: 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.039 c