Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Автоматическое уничтожение объектов  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
rgreat,

зачем мне Assigned если я буду уверен, что там всё хорошо?
29 мар 21, 20:19    [22301675]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
rgreat
Member

Откуда:
Сообщений: 6653
kealon(Ruslan)
rgreat,

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

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

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

Разве что так:
if Assigned(X) then begin
  try 
    X.DoSomething;
  except
  end;
end;

Но тут и assign-то нужен только для того что бы тормозило меньше.

Сообщение было отредактировано: 29 мар 21, 20:37
29 мар 21, 20:42    [22301682]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
alekcvp
Member

Откуда:
Сообщений: 2792
X11
после Free остается ссылка

Тебе не всё равно что там останется, если после вызова деструктора ссылка на сам интерфейс будет невалидной?..
29 мар 21, 23:04    [22301733]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
В методах такая фишка с автоуничтожением бесполезна, как по мне -- там у программиста полный контроль. А вот в сложных схемах, где создание и уничтожение разделены во времени и месту -- может пригодиться.

Например, я аналог такого объекта использовал для сборки и корректного уничтожения созданных ресурсов при завершении/закрытии приложения, когда оно может быть завершено в любой момент, а проверять вручную каждый ресурс накладно/муторно.
29 мар 21, 23:48    [22301754]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
А вообще, есть одна задача, где автоуничтожение могло быть полезно (если натянуть сову на глобус): если у нас есть список объектов, но при этом часть из них должно быть уничтожено (к примеру, мы туда копии/временные значения помещаем).

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

Пример:

var
  refs: TList<TObject>;
begin
  refs: TList<TObject>.Create;

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

  // тогда при завершении мы должны уничтожить сам список и все копии, которые в нем есть, но не оригиналы
  FreeAndNil(refs);
end;
30 мар 21, 00:02    [22301757]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
DmSer
TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка).

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

16620568
30 мар 21, 00:04    [22301758]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
JayDi
В методах такая фишка с автоуничтожением бесполезна, как по мне

Наоборот. Она полезна примерно в той же степени, что и исключения.
30 мар 21, 00:06    [22301760]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
rgreat
"Хорошо" - это 100% уверенность в том что по указателю не может быть мусора. Только либо живой объект либо nil.

Ну, если кто-то программирует без подобной уверенности, он... рисковый чувак с тягой к гомосексуальным контактам, назовём так.
30 мар 21, 00:07    [22301761]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
ma1tus
Member

Откуда:
Сообщений: 778
встречалась минимум пара реализаций (без пруфов), но... "запас карман не тяготит"(c) -
DmSer
могу это оформить на своём аккаунте в гитхабе в виде отдельного модуля
do it, please )

Сообщение было отредактировано: 30 мар 21, 05:56
30 мар 21, 05:58    [22301787]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15181
rgreat
X11
после Free остается ссылка
не зря ведь придумали FreeAndNil

o := TObject.Create;
o.Free;

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



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

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

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


а как жеж тогда проверить существование объекта?
30 мар 21, 08:24    [22301802]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15181
alekcvp
X11
после Free остается ссылка

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


в том-то и дело, что при повторном использовании не все равно - надо знать и быть уверенным

Сообщение было отредактировано: 30 мар 21, 08:18
30 мар 21, 08:25    [22301803]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27064
Такой код мне кажется более читабельным:

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;


+
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
30 мар 21, 09:22    [22301824]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9961
И что бенчмарк показывает ?
30 мар 21, 09:25    [22301825]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
wadman,

вот только контроль типов исчезает
30 мар 21, 09:32    [22301828]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое уничтожение объектов  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Тоже добавлю свой вариант, банальный. Сахара не прикручивал, т.к. особо и не понадобилось пока

  //   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}
30 мар 21, 10:42    [22301868]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить