함수 결과로 무료 TStringlist?

Sep 09 2020

내가 호출하는 함수가 TStringList()를 반환하고 TStringList.Create변수에 할당하지 않고 직접 한 번 사용하면 (예 Data:=MyTStringFunction.Values['data'];:) 메모리 누수가 발생합니까 아니면 TStringList가 자동으로 해제됩니까?

답변

4 DalijaPrasnikar Sep 09 2020 at 02:53

함수가 새 문자열 목록을 생성하면 코드가 누출됩니다.

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

반환 된 목록의 값을 변수에 저장하고 Free완료 한 후에 저장해야합니다.

var
  List: TStringList;

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

참고 : Delphi 10.3 Rio는 여전히 모바일 컴파일러에 ARC 객체 관리 를 사용하므로 위 코드가 ARC 플랫폼 (iOS, Android)에서 엄격하게 실행되면 유출되지 않습니다. 그러나 코드가 비 ARC 플랫폼 (Windows, Linux, macOS)에서 실행되어야하거나 Delphi 10.4로 업그레이드 된 Free경우에는 호출해야합니다. 이러한 코드는 모든 플랫폼에서 제대로 작동합니다.