![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение вложенных объектов
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.