Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];

Вниз

Access violation в приведённом ниже коде. В чём ошибка?   Найти похожие ветки 

 
Makhanev A.S.   (2003-02-26 05:50) [0]

Как правильно освободить ресурсы, выделенные под класс с свойством-массивом объектов?


TID3v2Frame = class(TPersistent)
private
... простой класс с одним св-вом типа Объект - всё стандартно
public
...
end;

TFrames = class(TPersistent)
private
FItems: TList; // список указателей "синхронизирован" с Items, т.е. GetItem и SetItem работают через FItems
...
public
constructor Create;
destructor Destroy; override;
...
procedure Clear;
property Items[index: Integer]: TID3v2Frame read GetItem write SetItem; default;
end;

{ TFrames }

constructor TFrames.Create;
begin
inherited;
FItems := TList.Create;
end;

destructor TFrames.Destroy;
begin
Clear;
FItems.Free;
inherited;
end;

procedure TFrames.Clear;
var
i: Byte;
begin
// если был вызван деструктор класса, то при втором проходе цикла возникает AV, иначе - всё ОК.
while FItems.Count > 0 do
TID3v2Frame(FItems.Last).Free;
end;

function TFrames.GetItem(AIndex: Integer): TID3v2Frame;
begin
Result := TID3v2Frame(FItems[AIndex]);
end;

procedure TFrames.SetItem(AIndex: Integer; Value: TID3v2Frame);
begin
FItems[AIndex] := Value; // знак присвоения, т.к. FItems - массив указателей
end;




Проблема в освобождении массива объектов Items - метод Clear в TFrames. Причём Clear выдаёт AV только после вызова деструктора TFrames. Сам по себе Clear не глючит.
Что я упустил?

Благодарю за внимание.


 
Palladin   (2003-02-26 06:15) [1]

Нифига не понял конечно конструкцию... хотя догадываюсь

while FItems.Count > 0 do
begin
TID3v2Frame(FItems.Last).Free;
FItems.Delete(FItems.Count-1);
end;


try this...


 
MBo   (2003-02-26 06:30) [2]

>Clear выдаёт AV только после вызова деструктора TFrames
Пардон, о каком вызове метода может идти речь, если объект уже уничтожен?


 
Palladin   (2003-02-26 06:37) [3]

:)))))))

надо больше спать...


 
Makhanev A.S.   (2003-02-26 17:36) [4]


> MBo © (26.02.03 06:30)


destructor TFrames.Destroy;
begin
Clear;
FItems.Free;
inherited;
end;


Разве Clear вызывается когда объект TFrames уже уничтожен????
Ведь он будет уничтожен после inherited. Я не прав???



> Palladin © (26.02.03 06:37)

Надо.... но работать порой хочется больше, чем спать:)


 
Романов Р.В.   (2003-02-26 17:51) [5]

// если был вызван деструктор класса, то при втором проходе цикла возникает AV, иначе - всё ОК.
while FItems.Count > 0 do
TID3v2Frame(FItems.Last).Free;


А Count кто уменьшать будет?


 
Smashich   (2003-02-26 17:56) [6]

2 Makhanev A.S. © (26.02.03 05:50)

Романов Р.В. © (26.02.03 17:51)
Count кто уменьшать будет?

Palladin © (26.02.03 06:15)
while FItems.Count > 0 do
begin
TID3v2Frame(FItems.Last).Free;
FItems.Delete(FItems.Count-1); //!!!!!!!!!!!!!!!!!
end;
try this...

те уже все рассказали!


 
Makhanev A.S.   (2003-02-26 18:28) [7]


> Smashich © (26.02.03 17:56)

не всё так просто, вернусь, подробней опишу суть проблемы.


 
Clickmaker   (2003-02-26 18:31) [8]

for i := FItems.Count-1 downto 0 do
TID3v2Frame(FItems[i]).Free;


 
REA   (2003-02-26 18:39) [9]

Может лучше TFrames = class(TObjectList), если компонент владеет объектами, а если не владеет, то и не уничтожать в нем объекты.
Если таки надо их уничтожить все-равно можно
OwnsObject := True; // From now all be dead
Clear; // Kill em all
OwnsObject := False; // Return to pointer storage mode



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.038 c
1-29894
Nehto
2003-02-26 15:40
2003.03.10
Vozmozhno uznat s kakoj formi bila otkrita forma?


7-30137
RV
2003-01-09 11:16
2003.03.10
Как узнать, что выключили свет?


7-30168
Igor---
2003-01-09 16:40
2003.03.10
Доступ к функциям BIOS из Win2000, XP, NT


3-29726
Al11
2003-02-19 11:12
2003.03.10
Можно ли Фильтровать полученный Query по выч.полям.


3-29730
exciter_
2003-02-19 11:58
2003.03.10
Как создать SHADOW для базы InterBase ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский