Kiểm tra tràn bộ nhớ
Dễ dàng kiểm tra xem chương trình của bạn có bị tràn bộ nhớ hay không
Dễ dàng kiểm tra xem chương trình của bạn có bị tràn bộ nhớ hay không
Lỗi tràn bộ nhớ (memory leaks) là một lỗi khá thông dụng. Hiểu đơn giản thì khi bạn tạo một object mà không giải phóng nó, tức là cấp bộ nhớ cho object mà không thu hồi lại thì lỗi tràn bộ nhớ sẽ xảy ra. Tuy lượng bộ nhớ bị lãng phí là khá nhỏ, nhưng đến một lúc nào đó sẽ làm cho chương trình của bạn bị dừng (do lỗi stackoverflow).
Delphi không hỗ trợ trình thu gom rác (GC) như C# hay Java, bạn phải thu hồi bộ nhớ thủ công. Việc này có thể thực hiện bằng cách dùng khối try ... finally để tạo và thu hồi các object. Xem thêm chi tiết tại Quản lý bộ nhớ
Có nhiều cách để kiểm tra, và cũng có một số công cụ để hỗ trợ việc này. Nhưng hôm nay mình sẽ trình bày một cách đơn giản và có thể áp dụng ngay được trong IDE.
Đầu tiên, hãy tạo một ứng dụng đơn giản (File > New > VCL Application) và thêm một Button vào form chính.
Nhấp đúp vào Button1 để mở trình chỉnh sửa mã, với sự kiện Button1OnClick.
Thêm mã này vào, đây là mã mà mình cố tình tạo ra một lỗi tràn bộ nhớ.
procedure TForm1.Button1Click(Sender: TObject);
var
O: TObject;
begin
O := TObject.Create;
end;
Trên đây, object O đã được cấp phát bộ nhớ (bằng method Create) nhưng không được thu hồi khi sử dụng xong (Free), nên sẽ dẫn đến memory leaks.
Khi chạy chương trình và nhấp vào Button1, không có gì xảy ra cả.
Lưu ý: Một số bạn nhầm tưởng khi đóng chương trình là tất cả bộ nhớ sẽ được hệ điều hành thu hồi lại. ĐIều đó là không đúng.
Để kiểm tra chương trình có lỗi memory leaks không, hãy nhìn vào cửa sổ Project Manager. Nhấp chuột phải vào tên chương trình (đang chọn, được in đậm) và nhấn View Sources (phím tắt Ctrl+V)
Mã chương trình chính có dạng như sau:
program Project27;
uses
Vcl.Forms,
Unit36 in 'Unit36.pas' {Form36};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm36, Form36);
Application.Run;
end.
Bây giờ, bạn chỉ việc thêm một dòng mã vào ngay sau từ khóa begin của chương trình chính (tệp DPR).
program Project27;
uses
Vcl.Forms,
Unit36 in 'Unit36.pas' {Form36};
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := true;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm36, Form36);
Application.Run;
end.
Nhấn Ctrl+S để lưu lại, và chạy thử chương trình mới được sửa đổi.
Sau khi chương trình đóng lại, một cửa sổ sẽ hiện ra thông báo có lỗi memory leaks (nếu có) như hình trên. Bạn có thể dựa vào tên các class để tìm kiếm vị trí gây ra lỗi.
Một số công cụ khác cũng hỗ trợ tìm memory leaks với nhiều tính năng hơn, các bạn có thể tìm hiểu thêm.