powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое уничтожение объектов
54 сообщений из 54, показаны все 3 страниц
Автоматическое уничтожение объектов
    #40057743
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализовал (по работе) механизм, который позволяет автоматически уничтожать объекты. Избавляет от необходимости использования try..finally для удаления объектов.
Пример кода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure Test;
var
  h: TSmartHolder;
  L: TList;
  ini: TIniFile;
  sl: TStrings;
begin
  L := h.CreateList(); // Создание типового объекта
  // далее используем переменную L как обычно

  h.RegObj(ini, TIniFile.Create('myfile.ini')); // Создание произвольного объекта
  // далее используем переменную ini как обычно

  sl := h.RegObj(TStringList.Create) as TStrings; // Создание произвольного объекта
end;



TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка).
Соответственно, все объекты будут уничтожены, как только интерфейсная ссылка будет обнулена, т.е. при выходе рекорда из области видимости.
Работает, начиная с Delphi 2007.
На мой взгляд, штука очень удобная.

Если есть интерес, я могу это оформить на своём аккаунте в гитхабе в виде отдельного модуля.
С другой стороны, не исключаю, что вариантов реализации данного велосипеда уже множество (но мне до сих пор не попадалось) :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057771
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Умный указатель через reference to function интереснее... там даже подсказчик кода работает и синтаксис использования не меняется, кроме объявления...
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057775
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Умный указатель через reference to function интереснее... там даже подсказчик кода работает и синтаксис использования не меняется, кроме объявления...


Где посмотреть на это?
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057779
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка).
Тогда ты ее постоянно перезаписываешь. Или там у тебя какой-то IInterfacedList?
DmSer
На мой взгляд, штука очень удобная.
Если изменить требование D2007 на D2009, то RegObj можно объявить дженерик методом и уйти от каста
Код: pascal
1.
function RegObj<T: class>(const AVal: T): T;


DmSer
На мой взгляд, штука очень удобная.
Иногда последовательность уничтожения объектов важна.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057785
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО это не красиво и не очень удобно.

Не надо связываться с интерфейсами, где это явно не требуется.

В конце концов если сильно хочется - используй рекорды. Благо там теперь и конструктор с деструктором есть.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057787
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда ты ее постоянно перезаписываешь. Или там у тебя какой-то IInterfacedList?

Там объект, который хранит список зарегистрированных объектов в TList. Объект реализует интерфейс. В рекорде хранится интерфейсная ссылка на этот объект.

Если изменить требование D2007 на D2009, то RegObj можно объявить дженерик методом и уйти от каста

Можно, как вариант.

Иногда последовательность уничтожения объектов важна

Разные ситуации бывают, конечно.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057791
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
ИМХО это не красиво и не очень удобно.

Не надо связываться с интерфейсами, где это явно не требуется.

В конце концов если сильно хочется - используй рекорды. Благо там теперь и конструктор с деструктором есть.


В коде нет явной работы с интерфейсами (см. пример в начале). Всё спрятано в методы рекорда. Интерфейсная ссылка объявлена как private.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057793
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  ISmartPointer<T: class> = reference to function: T;

  TSmartPointer<T: class> = class(TInterfacedObject, ISmartPointer<T>)
  strict private
    FObject: T;
    function Invoke: T; inline;
  public
    constructor Create(const aObject: T);
    destructor Destroy; override;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
{ TSmartPointer<T> }

function TSmartPointer<T>.Invoke: T;
begin
  Exit(FObject);
end;

constructor TSmartPointer<T>.Create(const aObject: T);
begin
  FObject := aObject;
end;

destructor TSmartPointer<T>.Destroy;
begin
  FreeAndNil(FObject);
  inherited Destroy();
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  x: ISmartPointer<TForm2>;
begin
  x := TSmartPointer<TForm2>.Create(TForm2.Create(nil));
  x.Caption := '123';
  x.ShowModal();
end;



В последних версиях сломали правда CodeInsight...
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057795
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование RegObj выглядит не очень красиво. К сожалению. Тут ничего не поделаешь.
Но такой код смотрится вполне прилично:

Код: pascal
1.
var L := h.CreateStringList();



можно так:
Код: pascal
1.
2.
var L := TStringList.Create();
h.RegObj(L);



У меня в коде есть классы, которые я чаще всего использую (назовём их "типовые классы"). Для них сделал функции создания объекта (CreateStringList, CreateList и т.п.). Иногда добавляю новые функции по мере необходимости. Но это свой фирменный велосипед :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057796
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Код: pascal
1.
2.
3.
4.
5.
destructor TSmartPointer<T>.Destroy;
begin
  FreeAndNil(FObject);
  inherited Destroy();
end;


Зачем?.. Почему не Free?

Ну и каждое обращение к переменной - вызов функции, ну такое себе. Хотя надо смотреть как компилятор вызов заинлайнит.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057805
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Да все равно... Можно и Free
Ну это уже проблемы компилятора, если он не сможет заинлайнить))) За сомнительное удобство, не из коробки, надо платить...
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057807
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Хотя надо смотреть как компилятор вызов заинлайнит.

Это же интерфейс, откуда там инлайну взяться. Однако, прикольное колдунство :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057815
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
var
x: ISmartPointer<TForm2>;
begin
x := TSmartPointer<TForm2>.Create(TForm2.Create(nil));

Не заметил особого преимущества по сравнению с

Код: pascal
1.
2.
3.
4.
5.
var
  x: TForm2;
  h: TSmartHolder;
begin
  x := h.RegObj(TForm2.Create(nil)) as TForm2;



А пытаться понять как работает ISmartPointer - ещё сложнее, чем разобраться с фильмом Довод :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057819
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Не заметил особого преимущества

Если правильно помню, эту запись:
Код: pascal
1.
x := TSmartPointer<TForm2>.Create(TForm2.Create(nil));


можно сократить до:
Код: pascal
1.
x := TSmartPointer.Create(TForm2.Create(nil));


или вообще создание смартпоинтера завернуть в функцию, например:
Код: pascal
1.
x := Auto(TForm2.Create(nil));
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057828
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
можно сократить до:
Нельзя.
1. TSmartPointer и TSmartPointer<T> - это разные типы.
2. Можно было бы писать
Код: pascal
1.
x := TSmartPointer<>.Create(TForm2.Create(nil));

но это вам не джава и автовывод типов сюда не завезли
Kazantsev Alexey
или вообще создание смартпоинтера завернуть в функцию,
Нельзя. Дженерик-функций не бывает
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057836
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Нельзя.
1. TSmartPointer и TSmartPointer<T> - это разные типы.

Верно, только не специализированных дженериков не бывает.

_Vasilisk_
но это вам не джава и автовывод типов сюда не завезли

Да, это я с выводом типов для дженериковых методов спутал.

_Vasilisk_
Нельзя. Дженерик-функций не бывает

А это я с FPC спутал, там они есть :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057843
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

в любом случае если у тебя появляется AS, значит код уже сразу выглядит аналогично тому как звучит
нельзя использовать хаки везде подряд, карма портится
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057846
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Kazantsev Alexey
можно сократить до:
Нельзя.
1. TSmartPointer и TSmartPointer<T> - это разные типы.
2. Можно было бы писать
Код: pascal
1.
x := TSmartPointer<>.Create(TForm2.Create(nil));

но это вам не джава и автовывод типов сюда не завезли
Kazantsev Alexey
или вообще создание смартпоинтера завернуть в функцию,
Нельзя. Дженерик-функций не бывает
как вариант можно хелпером к TObject, мало уже кто функции пишет чистые
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057848
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
DmSer,

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


Мы пока на D2007 работаем. Деваться некуда :))
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057869
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Нельзя. Дженерик-функций не бывает


Бывают)
Код: pascal
1.
2.
3.
4.
  TStatic = class
  public
    class function Test<T: class>(const aObj: T): T; static;
  end;


Например так :)
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057871
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще в Spring 4D реализованы smart pointers на вкус и цвет..

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  {$REGION 'Shared smart pointer'}

  IShared<T> = reference to function: T;

  {$REGION 'Weak smart pointer'}

  IWeakReference<T> = interface
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057943
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Да все равно... Можно и Free


а если останется ссылка и ты будешь проверять и обращаться? будет AV
думаю, FreeAndNil - правильный всегда вариант
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057956
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
X-Cite
Да все равно... Можно и Free

а если останется ссылка и ты будешь проверять и обращаться? будет AV
думаю, FreeAndNil - правильный всегда вариант

Какая ссылка, если речь идёт о деструкторе?.. Если у тебя после этого останется ссылка, к которой ты будешь обращаться, то ты ССЗБ.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057964
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после Free остается ссылка
не зря ведь придумали FreeAndNil

Код: pascal
1.
2.
3.
4.
o := TObject.Create;
o.Free;

if Assigned(o) then o.Width := 10;



По идее Assigned(o) вернет True
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057970
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
после Free остается ссылка
не зря ведь придумали FreeAndNil

Код: pascal
1.
2.
3.
4.
o := TObject.Create;
o.Free;

if Assigned(o) then o.Width := 10;



По идее Assigned(o) вернет True

А не надо так делать.

Вообще с Assigned надо быть очень аккуратным и точно знать как работает то что туда передаешь.
Ибо если не уверен на 100% что в o может быть либо живой объект либо nil то Assigned применять вообще нельзя.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057973
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

зачем мне Assigned если я буду уверен, что там всё хорошо?
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40057978
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
rgreat,

зачем мне Assigned если я буду уверен, что там всё хорошо?

"Хорошо" - это 100% уверенность в том что по указателю не может быть мусора.
Только либо живой объект либо nil.

Если 100% уверенности в таком нет, то и Assign использовать никак нельзя.

Разве что так:
Код: pascal
1.
2.
3.
4.
5.
6.
if Assigned(X) then begin
  try 
    X.DoSomething;
  except
  end;
end;


Но тут и assign-то нужен только для того что бы тормозило меньше.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058012
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
после Free остается ссылка

Тебе не всё равно что там останется, если после вызова деструктора ссылка на сам интерфейс будет невалидной?..
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058031
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В методах такая фишка с автоуничтожением бесполезна, как по мне -- там у программиста полный контроль. А вот в сложных схемах, где создание и уничтожение разделены во времени и месту -- может пригодиться.

Например, я аналог такого объекта использовал для сборки и корректного уничтожения созданных ресурсов при завершении/закрытии приложения, когда оно может быть завершено в любой момент, а проверять вручную каждый ресурс накладно/муторно.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058033
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, есть одна задача, где автоуничтожение могло быть полезно (если натянуть сову на глобус): если у нас есть список объектов, но при этом часть из них должно быть уничтожено (к примеру, мы туда копии/временные значения помещаем).

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

Пример:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  refs: TList<TObject>;
begin
  refs: TList<TObject>.Create;

  // основной код, заполняет список реальными объектами, которые в другом месте хранятся
  refs.Add(realObject);
  
  // дополнительный код, который добавляет временные значения, созданные тут же
  refs.Add(realObject.CopyAndModify());

  // тогда при завершении мы должны уничтожить сам список и все копии, которые в нем есть, но не оригиналы
  FreeAndNil(refs);
end;
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058034
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка).

Ну и зачем тебе трёхколёсный цирковой велосипед?

16620568
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058036
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JayDi
В методах такая фишка с автоуничтожением бесполезна, как по мне

Наоборот. Она полезна примерно в той же степени, что и исключения.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058037
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
"Хорошо" - это 100% уверенность в том что по указателю не может быть мусора. Только либо живой объект либо nil.

Ну, если кто-то программирует без подобной уверенности, он... рисковый чувак с тягой к гомосексуальным контактам, назовём так.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058053
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
встречалась минимум пара реализаций (без пруфов), но... "запас карман не тяготит"(c) -
DmSer
могу это оформить на своём аккаунте в гитхабе в виде отдельного модуля
do it, please )
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058066
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
X11
после Free остается ссылка
не зря ведь придумали FreeAndNil

Код: pascal
1.
2.
3.
4.
o := TObject.Create;
o.Free;

if Assigned(o) then o.Width := 10;




По идее Assigned(o) вернет True

А не надо так делать.

Вообще с Assigned надо быть очень аккуратным и точно знать как работает то что туда передаешь.
Ибо если не уверен на 100% что в o может быть либо живой объект либо nil то Assigned применять вообще нельзя.


а как жеж тогда проверить существование объекта?
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058067
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
X11
после Free остается ссылка

Тебе не всё равно что там останется, если после вызова деструктора ссылка на сам интерфейс будет невалидной?..


в том-то и дело, что при повторном использовании не все равно - надо знать и быть уверенным
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058088
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой код мне кажется более читабельным:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
  List: TStringList;
begin
  List := Auto(TStringList.Create).Instance;
  // Do stuff with List...
  // No need to free anything.
  // Will automatically free contained object when interface goes out of scope. ie. at end of procedure/method.
  // Copes with exceptions - no need for try finally
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
nterface
 
type
 
  IcaAutoFree = interface
  ['{FEC11200-4C4E-49D7-9F9F-C7178A687DA4}']
    // Property methods
    function GetInstance: Pointer;
    // Properties
    property Instance: Pointer read GetInstance;
  end;
 
  TcaAutoFree = class(TInterfacedObject, IcaAutoFree)
  private
    // Private fields
    FInstance: TObject;
    // Property methods
    function GetInstance: Pointer;
  public
    constructor Create(AInstance: TObject);
    destructor Destroy; override;
  end;
 
function Auto(AInstance: TObject): IcaAutoFree;
 
implementation
 
constructor TcaAutoFree.Create(AInstance: TObject);
begin
  inherited Create;
  FInstance := AInstance;
end;
 
destructor TcaAutoFree.Destroy;
begin
  FInstance.Free;
  inherited;
end;
 
  // Property methods
 
function TcaAutoFree.GetInstance: Pointer;
begin
  Result := FInstance;
end;
 
function Auto(AInstance: TObject): IcaAutoFree;
begin
  Result := TcaAutoFree.Create(AInstance);
end;



Src: https://forum.lazarus.freepascal.org/index.php/topic,37524.msg252351.html#msg252351
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058089
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что бенчмарк показывает ?
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058092
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

вот только контроль типов исчезает
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40058120
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже добавлю свой вариант, банальный. Сахара не прикручивал, т.к. особо и не понадобилось пока

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
  //   var ptr: IAutoPtr<TTestClass>;
  //   ptr := TAutoPtr<TTestClass>.Create(TTestClass.Create);
  //   ptr.Obj.SomeMethod ...
  IAutoPtr<T: class> = interface
    function GetObject: T;
    property Obj: T read GetObject;
  end;

  TAutoPtr<T: class> = class(TInterfacedObject, IAutoPtr<T>)
  strict private
    FObj: T;
  public
    constructor Create(Obj: T);
    destructor Destroy; override;
    function GetObject: T;
  end;

{$REGION 'TAutoPtr<T>'}

constructor TAutoPtr<T>.Create(Obj: T);
begin
  inherited Create;
  FObj := Obj;
end;

destructor TAutoPtr<T>.Destroy;
begin
  FreeAndNil(FObj);
  inherited;
end;

function TAutoPtr<T>.GetObject: T;
begin
  Result := FObj;
end;

{$ENDREGION}
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072329
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложил на github исходники TSmartHolder. На мой взгляд - очень удобная и надежная штука.
Отлаживал только методы RegObj, FreeObj и Clear. Надеюсь и остальное всё работает.
В последние пол года я в своих проектах (на работе) практически не использую try..finally для контроля уничтожения объектов. Стараюсь использовать TSmartHolder. Скорее всего производительность будет чуть хуже, чем при try..finally, зато работать в коде, не замусоренном try..finally, намного приятнее.
Исходники получились очень простые, 300 строк, из них 100 - это реализация FastStringReplace, скопипасченная отсюда . Для новых версий Delphi она разумеется не нужна, там и обычный StringReplace is very fast!
Пример использования:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   procedure MyProc;
   var
     AList: TList;
     h: TSmartHolder;
   begin
     AList := h.CreateList();
     // or universal way:  AList := h.RegObj(TList.Create) as TList;
     AList.Add('Hello!');
     // object "AList" will be destroyed automatically
     // you shouldn't use fry..finally or call destructor to destroy an object
   end;
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072333
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer> Стараюсь использовать TSmartHolder

Я код не читал, но что именно он делает -
тупо уничтожает все ссылки в деструкторе?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072337
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В новых средах удобно вот так:
TArray<TBitmap> чистка памяти
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072339
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Рекорды не всегда удобны, к сожалению.

Те же сеттеры в пропертях не умеют нормально работать с рекордами.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072342
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

не панацея, спорить не буду. однако местами очень удобны.
к слову из фишек в отличие от интерфейсов гарантируют финализацию всего даже при исключениях в финализаторах. то есть полноценная замена лестниц try/finally.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072346
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
DmSer> Стараюсь использовать TSmartHolder

Я код не читал, но что именно он делает -
тупо уничтожает все ссылки в деструкторе?


Хранит интерфейсную ссылку ISmartHolder. Плюс предоставляет несколько удобных методов для создания типовых объектов.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072376
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
В новых средах удобно вот так:
TArray<TBitmap> чистка памяти


А что будет, если один такой рекорд скопировать в другой рекорд? Потом объект по 2 раза будет уничтожаться и ещё плюс утечка будет? Тогда нужно и операцию присвоения переопределять. Граблей, чувствуется, будет не мало.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072501
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072504
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
DmSer,

операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе.


Насчёт пулов к БД - не уверен, что так правильно. Даже в C# работа с ресурсами выполняется в рамках отдельного блока (using). Всегда понятно, в какой момент закроется подключение / датасет / файл.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072604
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
makhaon
DmSer,

операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе.


Насчёт пулов к БД - не уверен, что так правильно. Даже в C# работа с ресурсами выполняется в рамках отдельного блока (using). Всегда понятно, в какой момент закроется подключение / датасет / файл.

У меня тоже понятно. Как из области видимости вышло - так и закрылось.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072609
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Крутая реализация!
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072613
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon

У меня тоже понятно. Как из области видимости вышло - так и закрылось.


В принципе, в C++ практикуется такой подход. Там же по стандарту нету исключений и try..finally, вот и приходится подобные шаблоны использовать в качестве альтернативы try..finally.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072897
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой подход тоже вполне рабочий:

Код: pascal
1.
List := Auto(TStringList.Create).Instance



Но нужно понимать, что работает он за счёт временной переменной (интерфейсной ссылки), которую компилятор вставляет в месте каждого вызова функции Auto. На данный момент компилятор Delphi чистит эти временные переменные только при выходе из функции. Но что, если поведение завтра изменится? Вполне могут решить, что раз временная переменная не используется, можно её сразу занилить. В Лазарусе вроде так и сделали.
...
Рейтинг: 0 / 0
Автоматическое уничтожение объектов
    #40072971
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адаптировал TSmartHolder под Lazarus. Вроде кроме MODE DELPHI ничего не потребовалось.
Проверил вариант "Auto().Instance" - под лазарусом оно не работает. Предположительно там используется одна временная интерфейсная ссылка на все вызовы функции.
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое уничтожение объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]