Verschiebungen für Delphi
Ein Analogon des Mechanismus zur verzögerten Freisetzung von Ressourcen (Objekt, Speicher oder Stornierung einer Aktion) aus der Zig -Programmiersprache.
Das Wesen des Mechanismus ist, dass nach einiger Aktion eine Stornierungsaktion erstellen wird, die beim Ausgang des Blocks ausgeführt wird.
Das heißt, wir haben zum Beispiel ein Objekt erstellt. Nach der Erstellung schreiben wir, wie man es freigibt, und es wird automatisch veröffentlicht, nachdem er den Block beendet hat.
Der Mechanismus funktioniert auf der Grundlage von Schnittstellen.
Wenn Sie eine Ausnahme in einen Block einwerfen, wird die Freisetzung des Objekts nicht verhindert.
defer wird verwendet, um eine Anweisung auszuführen, während Sie den aktuellen Block verlassen. errdefer funktioniert wie defer , aber nur auszuführen, wenn die Funktion mit einem Fehler innerhalb des Errdefer -Blocks zurückgegeben wird.
Objekt
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 iterationVerfahren
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;Erinnerung
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 ;