Отложить для Дельфи
Аналог механизма для отсроченного высвобождения ресурсов (объект, память или отмену действия) из языка программирования Zig.
Суть механизма заключается в том, что после некоторого действия создает действие отмены, которое будет выполнено, когда блок выходит.
То есть, например, мы создали объект, после создания мы пишем, как его выпустить, и он будет выпущен автоматически после выхода из блока.
Механизм работает на основе интерфейсов.
Бросить исключение в блоке не предотвращает освобождение объекта.
defer используется для выполнения оператора при выходе из текущего блока. errdefer работает как defer , но выполнение только тогда, когда функция возвращается с ошибкой внутри блока Errdefer.
Объект
uses
..., System.Defer;
type
...
TTestList = class (TStringList)
procedure DoRaise ;
destructor Destroy; override;
end ;
...
procedure TForm5.Button1Click (Sender: TObject);
begin
var Test := TTestList.Create;
defer(Test); // defer action
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
Test.DoRaise; // test raise
Test.Add( ' 4 ' );
end ; // free
{ TTestList }
destructor TTestList.Destroy;
begin
ShowMessage( ' test list destroy ' );
inherited ;
end ;
procedure TTestList.DoRaise ;
begin
raise Exception.Create( ' Error Message ' );
end ;
initialization
ReportMemoryLeaksOnShutdown := True; for var i := 1 to 4 do
begin
var Test := TTestList.Create;
defer(Test);
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
end ; // free of Test each iterationМетод
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;Память
var p: Pointer;
GetMem(p, 1024 ); // allocate mem
defer( procedure begin FreeMem(p) end ); // defer action for free mem
// work with p Errdefer
function GetList : TTestList;
begin
var List := TTestList.Create;
errdefer(List);
List.DoRaise;
Result := List;
end ;
procedure TForm5.Button5Click (Sender: TObject);
begin
var List := GetList; // exception, and no leaks
List.Free;
end ;