System.Defer
1.0.0
เลื่อนเวลา Delphi
อะนาล็อกของกลไกสำหรับการปล่อยทรัพยากรล่าช้า (วัตถุหน่วยความจำหรือการยกเลิกการกระทำ) จากภาษาการเขียนโปรแกรม 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 ;