İşlev sonucu olarak ücretsiz TStringlist?

Sep 09 2020

Çağırdığım bir işlev a TStringList(a ile TStringList.Create) döndürürse ve onu bir değişkene atamazsam ve doğrudan bir kez kullanırsam (gibi Data:=MyTStringFunction.Values['data'];) bir bellek sızıntısı olur mu yoksa TStringList otomatik olarak serbest bırakılır mı?

Yanıtlar

4 DalijaPrasnikar Sep 09 2020 at 02:53

İşlev yeni bir dizge listesi oluşturursa, kodunuz sızacaktır.

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

Döndürülen listenin değerini bir değişkende ve Freeişiniz bittikten sonra saklamanız gerekir .

var
  List: TStringList;

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

Not: Delphi 10.3 Rio , mobil derleyicileri için hala ARC nesne yönetimini kullandığından , yukarıdaki kod kesinlikle ARC platformlarında (iOS, Android) çalışıyorsa, sızıntı yapmayacaktır. Ancak kodun ARC olmayan platformlarda (Windows, Linux, macOS) çalışması gerekiyorsa veya Delphi 10.4'e yükseltilmişse, Freeçağrılması gerekir. Bu tür bir kod, tüm platformlarda düzgün çalışacaktır.