星期三, 3月 24, 2010

捉出程式中的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過後.結束程式時即會彈出如下的訊息

Delphi.ReportMemoryLeaksOnShutdown