Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего...
Может есть всё-таки выход из ситуации?
(буду рад любым линкам по теме, сам что-то ничего пока не нашёл )
Re: Smart pointers(деструкторы) в у Delphi
От:
Аноним
Дата:
24.02.04 07:40
Оценка:
Здравствуйте, Курилка, Вы писали:
К>Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего... К>Может есть всё-таки выход из ситуации? К>(буду рад любым линкам по теме, сам что-то ничего пока не нашёл )
в C++ все классы — суть object в Delphi, плюс автоматические деструкторы(с конструкторами хуже — в Delphi их можно заменить простые Init процедуры, "конструктор по умолчанию" обнуляет все поля). Так что class в Delphi совсем не то, что в C++. И принципы работы другие — выделяется только в куче, позволяет быть представителем интерфейса, COM-объектом напрямую, а не через страшные шаблоны как в C++ и пр. и пр. А вообще стоит посмотреть в исхдники VCL — там все такие кинструкции заключениы в try..finally..end, это такое правило . Хотя я для свох нужд сделал обвязку типа smart pointer для Delphi на интерфейсе — все стало проще правда для использования smart pointer существует жуткое количество ограничений, например нельзя использовать const& для содержимого но только это проблемы самой идеи, а не реализации.
Здравствуйте, Аноним, Вы писали:
А>в C++ все классы — суть object в Delphi, плюс автоматические деструкторы(с конструкторами хуже — в Delphi их можно заменить простые Init процедуры, "конструктор по умолчанию" обнуляет все поля). Так что class в Delphi совсем не то, что в C++. И принципы работы другие — выделяется только в куче, позволяет быть представителем интерфейса, COM-объектом напрямую, а не через страшные шаблоны как в C++ и пр. и пр. А вообще стоит посмотреть в исхдники VCL — там все такие кинструкции заключениы в try..finally..end, это такое правило . Хотя я для свох нужд сделал обвязку типа smart pointer для Delphi на интерфейсе — все стало проще правда для использования smart pointer существует жуткое количество ограничений, например нельзя использовать const& для содержимого но только это проблемы самой идеи, а не реализации.
Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста
C++ все классы — суть object в Delphi, плюс автоматические деструкторы
т.е. объект дельфи — класс C++ минус автоматические деструкторы, так чтоли?
Здравствуйте, Курилка, Вы писали:
К>Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста
можно, но это будет криво выглядеть
поэтому общей практикой является использование блоков try-finally
К>C++ все классы — суть object в Delphi, плюс автоматические деструкторы
К>т.е. объект дельфи — класс C++ минус автоматические деструкторы, так чтоли?
Здравствуйте, Курилка, Вы писали:
К>Может есть всё-таки выход из ситуации?
Вообще-то можно использовать интерфейсы (в них реализован подсчет ссылок), но ИМХО это полумера. Можно еще использовать garbage collector — несколько реализацией есть в интернете, ноя лично не пробывал.
> Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего... > Может есть всё-таки выход из ситуации? > (буду рад любым линкам по теме, сам что-то ничего пока не нашёл )
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, Курилка, Вы писали:
К>>Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста
ST>можно, но это будет криво выглядеть
Не так уж и криво.
Часто надо использовать локальные переменные — экземпляры классов, например, TStringList.
Тогда можно написать приметрно такой код:
interface
...
IObject = interface(IUnknown)
function getObject: TObject;
property AObject: TObject read getObject;
end;
TAutoPointer = class(TInterfacedObject, IObject)
private
FObj: TObject;
public
constructor Create(Obj: TObject);
destructor Destroy; override;
function getObject: TObject;
end;
implementation
constructor TAutoPointer.Create(Obj: TObject);
begin
FObj := Obj;
end;
destructor TAutoPointer.Destroy;
begin
FreeAndNil(FObj);
inherited;
end;
function TAutoPointer.getObject: TObject;
begin
Result := FObj;
end;
и вот так использовать
procedure SomeProcedure;
var
StringList: IObject;
begin
StringList := TAutoPointer.Create(TStringListCreate);
with StringList.AObject as TStringList do
begin// что-то делаем, но StringList не уничтожаемend;
// уничтожать StringList не надоend;
Здравствуйте, Oleg A. Bachin, Вы писали:
>> Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего... >> Может есть всё-таки выход из ситуации? >> (буду рад любым линкам по теме, сам что-то ничего пока не нашёл )
OAB>именно поэтому и смотрю последнее время в сторону C++. OAB>либо смотри в сторону интерфейсов: OAB>http://rsdn.ru/forum/Message.aspx?mid=544019
Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...
К>Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...
Тогда уж смотри в сторону Net.
и солнце б утром не вставало, когда бы не было меня
> > Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...
да, он бывают такие вещи как "корпаративный стандарт" и "куча наваяного кода"...
вот тогда, привыкнув к С++ (очень быстро кстати) и смотришь в сторону таких либ...
с год назад я ее рассматривал в чисто академическом плане, а вот на этой неделе вернулся т.к. понял, что с делфей спрыгнуть не удается, а писать небезопасный код уже не могу
так что либо интерфейсы либо try try try по типу:
var
HStmt : THStmt;
V : array [0..1] of Variant;
begin
Result := '';
HStmt := PrepareHStmt( Database, sql_GetPackageBody );
try
BindParamArray( HStmt, [PackageId, PackageType]);
HStmt.Execute;
try
while FetchNextRow( HStmt, V ) do
Result := Result + Var2Str(V[0]);
finally
CloseHStmt(HStmt);
end;
finally
FreeHStmt(HStmt);
end;
end;
OAB>так что либо интерфейсы либо try try try по типу:
OAB>
...
OAB>
Но ведь убого и неслабо чревато ошибками (т.е. можно забыть освободить ресурс, если он 1 то это элементарно, а если их до хохота разных?), неужто Delphi как инструмент появившийся попозже C++ не включает таких вещей? (причём не очень уж и сложных)
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Курилка, Вы писали: К>>Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику... S> Тогда уж смотри в сторону Net.
Смотрю, смотрю, но всё-таки это гораздо более высокая абстракция и плюсы позволяют управлять "более глубокими" механизмами. К примеру — как вы на .нете поменяете GC?
> OAB>так что либо интерфейсы либо try try try по типу: > > OAB>
> ...
> OAB>
> > Но ведь убого и неслабо чревато ошибками (т.е. можно забыть освободить ресурс, если он 1 то это элементарно, а если их до хохота разных?), неужто Delphi как инструмент появившийся попозже C++ не включает таких вещей? (причём не очень уж и сложных)
хм... говоришь "появившийся попозже C++" ? ... а по-моему последний стандарт С++ был позже...
Делфи — это в первую очередь RAD и уже потом ООП. к сожалению
вот сейчас пишу и плачу — нужно дописаль один кусок не в моем коде, вроде ООП, а в итоге — процедурное програмирование:
прямое обращение к глобальным переменным и десятки процедур одного класса — это форма! итого если убрать везде объявление формы получим что? правильно! обычное процедурное программирование
Здравствуйте, Oleg A. Bachin, Вы писали:
>> OAB>так что либо интерфейсы либо try try try по типу: >> >> OAB>
>> ...
>> OAB>
>> >> Но ведь убого и неслабо чревато ошибками (т.е. можно забыть освободить ресурс, если он 1 то это элементарно, а если их до хохота разных?), неужто Delphi как инструмент появившийся попозже C++ не включает таких вещей? (причём не очень уж и сложных)
OAB>хм... говоришь "появившийся попозже C++" ? ... а по-моему последний стандарт С++ был позже... OAB>Делфи — это в первую очередь RAD и уже потом ООП. к сожалению
Ну для дельфей стандартов нет вообще!
А плюсы ещё в 80-х появились (дату не скажу, но где-то там)
И отстутствие этих самых стандартов есть тоже неслабый минус, хотя реализация только одна, но вот как работает та или иная конструкция бывает просто хз где откопать (правда и в плюсах есть немало подковырок, но основные Мейерсы всякие описывают).
А стандарт не очень сильно сам язык переработал (правда шаблоны там появились, но их в шарп уже почти запихали, так что дельфи уж за 10 лет своей истории могли сподобиться и попробовать реализовать хоть что-то подобное) и те же деструкторы были там изначально.
Но что-то уже это всё превращается в флейм постепенно
OAB>вот сейчас пишу и плачу — нужно дописаль один кусок не в моем коде, вроде ООП, а в итоге — процедурное програмирование: OAB>прямое обращение к глобальным переменным и десятки процедур одного класса — это форма! итого если убрать везде объявление формы получим что? правильно! обычное процедурное программирование
Так вот дельфа и не приводит к ООП, хоть он в ней и есть, а в основном используется как скриптовые языки (VBS, Javascript) object-based, т.е. обычное процедурное, но с использованием объектов. И это немного (хоть и очень немного) напоминает забивание гвоздей видеомагнитофоном. Да ещё есть такое ощущение что даже сама борланд не очень ратует за ООП и проч. применительно к Дельфи, а картина рисуется: набросаешь компонентов, свойства выставишь, пару OnClick напишешь и вуаля — мегапрограмма готова...
ээээххх... к сожалению согласен...
хотя можно и на делфях писать прилично....
ладно, завязали, а то действительно в флейм перейдет, хотя...
где еще на делфю пожаловаться можно, чтобы не начали кричать: "Эй! С++ рулит!"
OAB>хм... говоришь "появившийся попозже C++" ? ... а по-моему последний стандарт С++ был позже... OAB>Делфи — это в первую очередь RAD и уже потом ООП. к сожалению OAB>вот сейчас пишу и плачу — нужно дописаль один кусок не в моем коде, вроде ООП, а в итоге — процедурное програмирование: OAB>прямое обращение к глобальным переменным и десятки процедур одного класса — это форма! итого если убрать везде объявление формы получим что? правильно! обычное процедурное программирование
Вступлюсь я За свой любимый язык.
Delphi позволяет писать как процедурно так и ООП.
Правда в Native Delphi нет статических переменных, но если есть желание полностью соответствовать ООП пиши синглтоны. Статические методы в том числе и виртуальные присутствуют как в Native так и Net.
Кстати в Net все процедуры и переменные трансформируются во внутреннем классе Unit, как статические переменные и методы.
По поводу Smart pointers, то существуют интерфейсы и safeCall.
Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally
их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией.
По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Вступлюсь я За свой любимый язык. S> Delphi позволяет писать как процедурно так и ООП. S>Правда в Native Delphi нет статических переменных, но если есть желание полностью соответствовать ООП пиши синглтоны. Статические методы в том числе и виртуальные присутствуют как в Native так и Net. S> Кстати в Net все процедуры и переменные трансформируются во внутреннем классе Unit, как статические переменные и методы. S> По поводу Smart pointers, то существуют интерфейсы и safeCall.
Т.е. для кажного случая мне эти интерфейсы прикручивать?
S> Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally S>их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией. S> По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.
Ага и Integer и String тоже?
Вот ненадо гнать пжлста...
S>> Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally S>>их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией. S>> По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.
К>Ага и Integer и String тоже? К>Вот ненадо гнать пжлста...
Интежер это структура или примитивный тип (как больше нравится).Кстати в Яве (могу ошибаться) нет структур, а в Net это струтуры самостоятельны как Value тип (в Native Delphi есть структуры с методами но считаются (лись) устаревшими). По поводу String то это исключение, как и для динамических массивов как встроенных объектов и что в этом плохого ????. Интефейсы же тоже поддерживаются компилятором и не надо как некоторым делать Addref или Realse хотя и это не проблема. Не говоря уже о позднем связывании.
Не надо хаять Язык.
и солнце б утром не вставало, когда бы не было меня
К>Так вот дельфа и не приводит к ООП, хоть он в ней и есть, а в основном используется как скриптовые языки (VBS, Javascript) object-based, т.е. обычное процедурное, но с использованием объектов. И это немного (хоть и очень немного) напоминает забивание гвоздей видеомагнитофоном. Да ещё есть такое ощущение что даже сама борланд не очень ратует за ООП и проч. применительно к Дельфи, а картина рисуется: набросаешь компонентов, свойства выставишь, пару OnClick напишешь и вуаля — мегапрограмма готова...
короче, так:
независимо от языка программирования в рамках проекта реализуется библиотека классов, необходимых для этого проекта и далее уже с использованием этой библиотеки пишутся приложения методом бросания компонентов, выставления cвойств, написания OnClick и вуаля...
если проекты просты, то 1-й этап (написания спец. библиотек классов) сожно опустить
кстати, такое впечатление, ты расстроен тем, что программы писать становится все проще и проще ?
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Курилка, Вы писали:
S>>> Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally S>>>их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией. S>>> По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.
К>>Ага и Integer и String тоже? К>>Вот ненадо гнать пжлста... S> Интежер это структура или примитивный тип (как больше нравится).Кстати в Яве (могу ошибаться) нет структур, а в Net это струтуры самостоятельны как Value тип (в Native Delphi есть структуры с методами но считаются (лись) устаревшими). По поводу String то это исключение, как и для динамических массивов как встроенных объектов и что в этом плохого ????.
А то, что язык получается ни чисто ОО, и чем обусловлено такое исключение не совсем понятно (вон в жабе замечательно строки как объекты существуют...)
S> Интефейсы же тоже поддерживаются компилятором и не надо как некоторым делать Addref или Realse хотя и это не проблема. Не говоря уже о позднем связывании. S> Не надо хаять Язык.
Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...
Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами...