Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-29797
Gonta
2003-02-27 17:51
2003.03.10
Работа с консольными приложениями


1-29791
kat
2003-02-26 14:37
2003.03.10
Освобождение памяти


14-30094
Delphinium
2003-02-22 13:07
2003.03.10
Шаровара


3-29776
VIB
2003-02-20 10:41
2003.03.10
DBGrid


1-29878
AlexanderSK
2003-02-26 13:28
2003.03.10
RemoteDataModule - Interface как передать строку?