powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое уничтожение объектов
25 сообщений из 54, страница 2 из 3
Автоматическое уничтожение объектов
    #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
25 сообщений из 54, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое уничтожение объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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