Diferir para Delphi
Un análogo del mecanismo para la liberación retrasada de recursos (objeto, memoria o cancelación de una acción) del lenguaje de programación en zig.
La esencia del mecanismo es que después de alguna acción, cree una acción de cancelación que se realizará cuando salga el bloque.
Es decir, por ejemplo, creamos un objeto, después de la creación, escribimos cómo liberarlo y se lanzará automáticamente después de salir del bloque.
El mecanismo funciona sobre la base de las interfaces.
Lanzar una excepción en un bloque no evita la liberación del objeto.
defer se usa para ejecutar una declaración al salir del bloque actual. errdefer funciona como defer , pero solo se ejecuta cuando la función se devuelve con un error dentro del bloque de ErrDefer.
Objeto
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 iterationMétodo
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;Memoria
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 ;