Форум: "Основная";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизУничтожение вложенных объектов Найти похожие ветки
← →
TUser © (2005-11-03 11:30) [0]Почему неправильно их унижтожать, как в посте [4] этой ветки? И как правильнее?
http://delphimaster.net/view/1-1131005206/
Там это был бы оффтоп.
← →
jack128 © (2005-11-03 11:35) [1]Их не правельно уничтожать через Free, если мы допускаем возможность исключения в деструкторе. Потому что если в унаследуемом деструкторе возникнет исключение, то мы получим битую ссылку.
PS методом Free не пользуюсь. Только FreeAndNil.
← →
Sergey_Masloff (2005-11-03 11:37) [2]jack128 © (03.11.05 11:35) [1]
>то мы получим битую ссылку.
В твоем методе - утечку памяти. Так ведь?
← →
umbra © (2005-11-03 11:40) [3]мне кажется, что ничего о недопустимости конструкции типа
destructor TSomeObj.Destroy;
begin
FSubObj.Free;
inherited;
end;
речь не шла. речь была о недопустимости исключений в деструкторе.
← →
umbra © (2005-11-03 11:45) [4]Единственное отличие
FSubObj.Free
отFreeAndNil(FSubObj)
в том, что послеFree
функцияAssigned(FSubObj)
вернетtrue
, а послеFreeAndNil(FSubObj)
-false
.
← →
jack128 © (2005-11-03 11:46) [5]Sergey_Masloff (03.11.05 11:37) [2]
В твоем методе - утечку памяти. Так ведь?
Да, если в в деструкторе FSubObj возникнет исключение. Собственно гарантию коректного выполнения даст только использование такой функции
procedure FreeAndNilEx(var Obj: TObject);
begin
FObj.Free;
FObj := nil;
end;
Но лично мне проще писать такие классы, которые бы не генерили исключений в деструкторе, чем вставлять везде и всюду проверки на нил.
← →
Sergey_Masloff (2005-11-03 11:54) [6]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;
так что действительно лучше
>проще писать такие классы, которые
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.014 c