Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.02.04 07:11
Оценка:
Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в 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& для содержимого но только это проблемы самой идеи, а не реализации.
Re[2]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.02.04 07:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>в C++ все классы — суть object в Delphi, плюс автоматические деструкторы(с конструкторами хуже — в Delphi их можно заменить простые Init процедуры, "конструктор по умолчанию" обнуляет все поля). Так что class в Delphi совсем не то, что в C++. И принципы работы другие — выделяется только в куче, позволяет быть представителем интерфейса, COM-объектом напрямую, а не через страшные шаблоны как в C++ и пр. и пр. А вообще стоит посмотреть в исхдники VCL — там все такие кинструкции заключениы в try..finally..end, это такое правило . Хотя я для свох нужд сделал обвязку типа smart pointer для Delphi на интерфейсе — все стало проще правда для использования smart pointer существует жуткое количество ограничений, например нельзя использовать const& для содержимого но только это проблемы самой идеи, а не реализации.


Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста

C++ все классы — суть object в Delphi, плюс автоматические деструкторы

т.е. объект дельфи — класс C++ минус автоматические деструкторы, так чтоли?
Re[3]: Smart pointers(деструкторы) в у Delphi
От: s.ts  
Дата: 24.02.04 10:18
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста


можно, но это будет криво выглядеть
поэтому общей практикой является использование блоков try-finally

К>C++ все классы — суть object в Delphi, плюс автоматические деструкторы


К>т.е. объект дельфи — класс C++ минус автоматические деструкторы, так чтоли?


это какие-то запутки, не стоит вникать
Re: Smart pointers(деструкторы) в у Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 24.02.04 12:13
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Может есть всё-таки выход из ситуации?


Вообще-то можно использовать интерфейсы (в них реализован подсчет ссылок), но ИМХО это полумера. Можно еще использовать garbage collector — несколько реализацией есть в интернете, ноя лично не пробывал.

Читаем Garbage Collector For Delphi Objects and Components, и здесь
Качаем Garbage Collector for Delphi и здесь
Re: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 24.02.04 13:10
Оценка:
> Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего...
> Может есть всё-таки выход из ситуации?
> (буду рад любым линкам по теме, сам что-то ничего пока не нашёл )

именно поэтому и смотрю последнее время в сторону C++.
либо смотри в сторону интерфейсов:
http://rsdn.ru/forum/Message.aspx?mid=544019
Автор: Oleg A. Bachin
Дата: 19.02.04
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[4]: Smart pointers(деструкторы) в у Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 24.02.04 13:14
Оценка: 14 (2)
Здравствуйте, 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;
Re[2]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.02.04 15:32
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

>> Просвятите чайника — никак не могу найти толкового описания времени жизни объектов в Delphi, есть такое ощущение, что для всех объектов нужно обязательно вызывать Free насильственно, что не очень-то помогает программисту на мой взгляд (для чего в C++ к примеру есть std:auto_ptr<>, но там для объекта в хипе деструктор вызывается автоматически). Допустим при возникновении исключений довольно криво будет всем объектам Free вызывать в случае чего...

>> Может есть всё-таки выход из ситуации?
>> (буду рад любым линкам по теме, сам что-то ничего пока не нашёл )

OAB>именно поэтому и смотрю последнее время в сторону C++.

OAB>либо смотри в сторону интерфейсов:
OAB>http://rsdn.ru/forum/Message.aspx?mid=544019
Автор: Oleg A. Bachin
Дата: 19.02.04


Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...
Re[3]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.02.04 15:46
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...

Тогда уж смотри в сторону Net.
и солнце б утром не вставало, когда бы не было меня
Re[3]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 24.02.04 15:57
Оценка:
> OAB>именно поэтому и смотрю последнее время в сторону C++.
> OAB>либо смотри в сторону интерфейсов:
> OAB>http://rsdn.ru/forum/Message.aspx?mid=544019
Автор: Oleg A. Bachin
Дата: 19.02.04

>
> Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...

да, он бывают такие вещи как "корпаративный стандарт" и "куча наваяного кода"...
вот тогда, привыкнув к С++ (очень быстро кстати) и смотришь в сторону таких либ...

с год назад я ее рассматривал в чисто академическом плане, а вот на этой неделе вернулся т.к. понял, что с делфей спрыгнуть не удается, а писать небезопасный код уже не могу
так что либо интерфейсы либо 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;
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[4]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 06:15
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:


OAB>так что либо интерфейсы либо try try try по типу:


OAB>
...
OAB>


Но ведь убого и неслабо чревато ошибками (т.е. можно забыть освободить ресурс, если он 1 то это элементарно, а если их до хохота разных?), неужто Delphi как инструмент появившийся попозже C++ не включает таких вещей? (причём не очень уж и сложных)
Re[4]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 08:30
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Курилка, Вы писали:

К>>Что-то как-то я тоже гораздо больше смотрю в сторону плюсов, т.к. в дельфах гораздо меньше документированы вот такие подробности, т.е. или хрен знает как сделать или извращаться, тогда как плюсы дают практически возможность переделать чуть ли не любую логику...
S> Тогда уж смотри в сторону Net.

Смотрю, смотрю, но всё-таки это гораздо более высокая абстракция и плюсы позволяют управлять "более глубокими" механизмами. К примеру — как вы на .нете поменяете GC?
Re[5]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 08:45
Оценка:
> OAB>так что либо интерфейсы либо try try try по типу:
>
> OAB>
> ...
> OAB>

>
> Но ведь убого и неслабо чревато ошибками (т.е. можно забыть освободить ресурс, если он 1 то это элементарно, а если их до хохота разных?), неужто Delphi как инструмент появившийся попозже C++ не включает таких вещей? (причём не очень уж и сложных)

хм... говоришь "появившийся попозже C++" ? ... а по-моему последний стандарт С++ был позже...
Делфи — это в первую очередь RAD и уже потом ООП. к сожалению
вот сейчас пишу и плачу — нужно дописаль один кусок не в моем коде, вроде ООП, а в итоге — процедурное програмирование:
прямое обращение к глобальным переменным и десятки процедур одного класса — это форма! итого если убрать везде объявление формы получим что? правильно! обычное процедурное программирование
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[6]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 09:20
Оценка:
Здравствуйте, 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 напишешь и вуаля — мегапрограмма готова...
Re[7]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 10:08
Оценка:
ээээххх... к сожалению согласен...
хотя можно и на делфях писать прилично....
ладно, завязали, а то действительно в флейм перейдет, хотя...
где еще на делфю пожаловаться можно, чтобы не начали кричать: "Эй! С++ рулит!"
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[6]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 11:55
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:


OAB>хм... говоришь "появившийся попозже C++" ? ... а по-моему последний стандарт С++ был позже...

OAB>Делфи — это в первую очередь RAD и уже потом ООП. к сожалению
OAB>вот сейчас пишу и плачу — нужно дописаль один кусок не в моем коде, вроде ООП, а в итоге — процедурное програмирование:
OAB>прямое обращение к глобальным переменным и десятки процедур одного класса — это форма! итого если убрать везде объявление формы получим что? правильно! обычное процедурное программирование
Вступлюсь я За свой любимый язык.
Delphi позволяет писать как процедурно так и ООП.
Правда в Native Delphi нет статических переменных, но если есть желание полностью соответствовать ООП пиши синглтоны. Статические методы в том числе и виртуальные присутствуют как в Native так и Net.
Кстати в Net все процедуры и переменные трансформируются во внутреннем классе Unit, как статические переменные и методы.
По поводу Smart pointers, то существуют интерфейсы и safeCall.
Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally
их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией.
По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.
и солнце б утром не вставало, когда бы не было меня
Re[7]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 12:20
Оценка:
Здравствуйте, 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 тоже?
Вот ненадо гнать пжлста...
Re[8]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 12:32
Оценка:
Здравствуйте, Курилка, Вы писали:


S>> Не представляет особого труда (хотя такая возможность явно не помешала), закинуть в некий список все создаваемые объекты и в Try Finally

S>>их освобождать. Кстати полохо, что в Net нет такого для объектов с финализацией.
S>> По поводу ООП и языков, то как можно говорить если в некоторых языках нет различия между структурами и объектами. А в Delphi как в Яве Net все объекты наследуются от базового (TObject,Object) класса.

К>Ага и Integer и String тоже?

К>Вот ненадо гнать пжлста...
Интежер это структура или примитивный тип (как больше нравится).Кстати в Яве (могу ошибаться) нет структур, а в Net это струтуры самостоятельны как Value тип (в Native Delphi есть структуры с методами но считаются (лись) устаревшими). По поводу String то это исключение, как и для динамических массивов как встроенных объектов и что в этом плохого ????. Интефейсы же тоже поддерживаются компилятором и не надо как некоторым делать Addref или Realse хотя и это не проблема. Не говоря уже о позднем связывании.
Не надо хаять Язык.
и солнце б утром не вставало, когда бы не было меня
Re[7]: Smart pointers(деструкторы) в у Delphi
От: s.ts  
Дата: 25.02.04 13:01
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Так вот дельфа и не приводит к ООП, хоть он в ней и есть, а в основном используется как скриптовые языки (VBS, Javascript) object-based, т.е. обычное процедурное, но с использованием объектов. И это немного (хоть и очень немного) напоминает забивание гвоздей видеомагнитофоном. Да ещё есть такое ощущение что даже сама борланд не очень ратует за ООП и проч. применительно к Дельфи, а картина рисуется: набросаешь компонентов, свойства выставишь, пару OnClick напишешь и вуаля — мегапрограмма готова...


короче, так:
независимо от языка программирования в рамках проекта реализуется библиотека классов, необходимых для этого проекта и далее уже с использованием этой библиотеки пишутся приложения методом бросания компонентов, выставления cвойств, написания OnClick и вуаля...

если проекты просты, то 1-й этап (написания спец. библиотек классов) сожно опустить

кстати, такое впечатление, ты расстроен тем, что программы писать становится все проще и проще ?
Re[9]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 13:39
Оценка: -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> Не надо хаять Язык.

Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...
Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.