Quản lý bộ nhớ
Delphi không hỗ trợ trình thu gom rác (GC), tất cả phải được thực hiện thủ công thông qua khối try ... finally
Delphi không hỗ trợ trình thu gom rác (GC), tất cả phải được thực hiện thủ công thông qua khối try ... finally
Không giống như C#, Java quản lý bộ nhớ tự động nhờ bộ thu gom rác (Garbage Collection - GC), Delphi bắt buộc lập trình viên phải tự quản lý bộ nhớ thủ công.
Cụ thể, khi bạn khởi tạo một đối tượng (các controls, các lớp, ...) bạn cần phải phá hủy chúng bằng phương thức Free để trả lại bộ nhớ khi sử dụng xong. Điều này thực hiện trong Delphi nhờ khối lệnh try ... finally.
Sau đây là một đoạn code có thể gây tràn bộ nhớ nếu thực hiện quá nhiều lần.
function Get2Line: string;
var
List: TStringList;
begin
List := TStringList.Create;
List.Add('This is line 1');
List.Add('This is line 2');
Result := List.Text;
end;
Ý nghĩa của hàm trên là tạo ra một chuỗi gồm 2 dòng nối lại với nhau.
Vấn đề ở đây là khi tạo một đối tượng List, người viết không giải phóng nó. Có nghĩa, nếu bạn gọi hàm này 1000 lần, sẽ có 1000 đối tượng List được tạo ra mà không bị xóa bỏ. Điều này sẽ gây tràn bộ nhớ (memory leak), một lỗi khá nghiêm trọng.
Để khắc phục tình trạng trên, Delphi sử dụng khối lệnh try ... finally để xử lý bộ nhớ khi đã sử dụng xong đối tượng.
function Get2Line: string;
var
List: TStringList;
begin
List := TStringList.Create;
try
List.Add('This is line 1');
List.Add('This is line 2');
Result := List.Text;
finally
List.Free;
end;
end;
Như trên, khối try sẽ thực hiện 1 số việc với đối tượng được khởi tạo, sau đó khi làm việc xong thì đối tượng sẽ bị xóa trong khối finally.
Mẹo: Delphi Code Insight sẽ giúp bạn tự động gõ khối try ... finally. Chỉ cần gõ try thì tất cả những dòng còn lại sẽ được tự động tạo ra như dòng Create, dòng Finally Free, ... Việc của bạn chỉ cần điền vào những chỗ trống được highlight và nhấn tab để chuyển sang vị trí mới.