Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отложенное освобождение объектов


Страницы:   1 2

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

гениально.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо