Главная страница
    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.038 c
5-1103884467
Anatoly
2004-12-24 13:34
2005.10.23
Сохранение не published-свойства компонента в dfm


4-1124343984
Shopot
2005-08-18 09:46
2005.10.23
Давайте вместе разберемся с TAPI.


3-1126527977
UVV
2005-09-12 16:26
2005.10.23
Blob и DBGridEh


2-1127996286
Dimon777
2005-09-29 16:18
2005.10.23
Как передать SQL-запросу период времени в виде параметра?


10-1105916731
GanibalLector
2005-01-17 02:05
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский