![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отложенное освобождение объектов
ggg © (2008-06-19 19:39:00)У меня в программе некоторые объекты имеют счетчик использования. Сделано это для того, что бы они не были удалены до того, когда на них перестанут ссылаться другие объекты.
Сначала пробывал добавить следующий код в деструктор:
destructor TGraphicObject.Destroy;
begin
if UseCount > 0 then
begin
FMustBeFree := true;
Exit;
end;
...
Но практически сразу же получал AV.
Поэтому создал метод Free;
procedure TGraphicObject.Free;
begin
if Assigned(Self) then
if UseCount > 0 then
FMustBeFree := true
else
inherited; // или Destroy, не важно
end;
Пока вроде бы проблем не наблюдается, но как-то беспокойно на душе :)
Собственно вопросы:
1) Destroy в любом случае удаляет объект, даже если там стоит Exit и не вызывается inherited?
2) Метод Free не помечен как virtual, соответсвенно и мой метод не может быть отмечен как override. Безопасно ли использовать такой способ? Или правильней будет создать некий MyFreeMethod, где будет проверяться FUseCount и вызываться Free?
Игорь Шевченко (2008-06-19 20:06:00) [21]Поросенок Винни-Пух © (19.06.08 20:04) [1]
> if Assigned(Self) then
>
> гениально.
Тебе никогда не встречался Self=nil ?
Игорь Шевченко (2008-06-19 20:06:00) [22]тебе надо посмотреть, как работает TInterfacedObject._Release - оно так примерно и делает, если ссылок 0, то вызывает Destroy
Или переопределить метод FreeInstance
Поросенок Винни-Пух (2008-06-19 20:05:00) [23]А оунер этого волшебного объекта в курсе что кто-то там что-то там считает?
:)
Поросенок Винни-Пух (2008-06-19 20:04:00) [24]procedure TGraphicObject.Free;
begin
if Assigned(Self) then
гениально.