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