TStringlist miễn phí là kết quả của hàm?

Sep 09 2020

Nếu một hàm tôi gọi trả về a TStringList(với a TStringList.Create) và tôi không gán nó cho một biến mà sử dụng nó một lần trực tiếp (như Data:=MyTStringFunction.Values['data'];) thì tôi sẽ bị rò rỉ bộ nhớ hay TStringList sẽ tự động được giải phóng?

Trả lời

4 DalijaPrasnikar Sep 09 2020 at 02:53

Nếu hàm tạo một danh sách chuỗi mới thì mã của bạn sẽ bị rò rỉ.

function MyTStringFunction: TStringList;
begin
  // constructing new string list
  Result := TStringList.Create;
  ...
end;

Bạn cần lưu trữ giá trị của danh sách trả về trong một biến và giá trị Freeđó sau khi bạn hoàn tất.

var
  List: TStringList;

List := MyTStringFunction;
try
  Data := List.Values['data'];
finally
  List.Free;
end;

Lưu ý: Vì Delphi 10.3 Rio vẫn sử dụng quản lý đối tượng ARC cho trình biên dịch di động của mình, nếu đoạn mã trên chạy nghiêm ngặt trên nền tảng ARC (iOS, Android) thì nó sẽ không bị rò rỉ. Nhưng nếu mã phải chạy trên các nền tảng không phải ARC (Windows, Linux, macOS) hoặc đã từng được nâng cấp lên Delphi 10.4, thì Freecần phải gọi. Mã như vậy sẽ hoạt động bình thường trên tất cả các nền tảng.