捉出程式中的Memory Leaks(物件未被釋放)
在Delphi的環境中.因為沒有全面的gc系統,所以讓系統不穩定的一個潛在原因為”物件建立後未被釋放”! 程式可能一開始都很正常,但經過反覆操作,久了後常因為記憶體(heap)爆了,而發生錯誤,此種未被正常釋放的物件行為可以稱為 MemoryLeaks
要排除這樣子的狀況,首先要有良好的寫作習慣,使用try finally 來釋放物件,例如
with TStringlist.create do
try
finally
free;
end
但在一個複雜的系統中,若要找出像這樣子的潛在問題,不可能拿出所有的code一行一行程式去review‧此時就需要用程式或工具的協助
- 導入要需要付費的 Eureka exception log
- 使用Delphi 內建的debug功能
使用delphi內建的debug功能,是個簡單又實惠的做法,只需要將 MemoryLeaksOnShutdown 變數設成true即可(在system)
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TStringList.Create do
begin
AddObject('1',TLabel.Create(nil));
AddObject('2',TLabel.Create(nil));
AddObject('3',TLabel.Create(nil));
end;
with TButton.Create(nil) do
begin
Parent := Self;
Visible := True;
end;
end;
當button1被click過後.結束程式時即會彈出如下的訊息