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

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

Уничтожение вложенных объектов


TUser ©   (2005-11-03 11:30:00) 

Почему неправильно их унижтожать, как в посте [4] этой ветки? И как правильнее?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1131005206&n=0

Там это был бы оффтоп.


Sergey_Masloff   (2005-11-03 11:54:00) [1]

jack128 ©   (03.11.05 11:46) [5]

разве что

procedure FreeAndNilEx(var Obj: TObject);
begin
 try
   try
     FObj.Free;
   finally
     FObj := nil;
   end;
 except
   WriteToLog('...oops');
 end;
end;


так что действительно лучше
>проще писать такие классы, которые


jack128   (2005-11-03 11:46:00) [2]

Sergey_Masloff   (03.11.05 11:37) [2]
В твоем методе - утечку памяти. Так ведь?


Да, если в в деструкторе FSubObj возникнет исключение. Собственно гарантию коректного выполнения даст только использование такой функции

procedure FreeAndNilEx(var Obj: TObject);
begin
 FObj.Free;
 FObj := nil;
end;

Но лично мне проще писать такие классы, которые бы не генерили исключений в деструкторе, чем вставлять везде и всюду проверки на нил.


umbra   (2005-11-03 11:45:00) [3]

Единственное отличие FSubObj.Freeот FreeAndNil(FSubObj)в том, что после Freeфункция Assigned(FSubObj)вернет true, а после FreeAndNil(FSubObj)- false.


umbra   (2005-11-03 11:40:00) [4]

мне кажется, что ничего о недопустимости конструкции типа


destructor TSomeObj.Destroy;
begin
FSubObj.Free;
inherited;
end;


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


Sergey_Masloff   (2005-11-03 11:37:00) [5]

jack128 ©   (03.11.05 11:35) [1]
>то мы получим битую ссылку.
В твоем методе - утечку памяти. Так ведь?


jack128   (2005-11-03 11:35:00) [6]

Их не правельно уничтожать через Free, если мы допускаем возможность исключения в деструкторе. Потому что если в унаследуемом деструкторе возникнет исключение, то мы получим битую ссылку.

PS методом Free не пользуюсь. Только FreeAndNil.


Наверх

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