Natürlich erzeugt das ein MemLeak, wenn du das nicht entsprechend behandlest und beim Aufruf der Funktion auch die LifeTime-Management-Verantwortung für das Ergebnis übernimmst.
Ist exakt das Gleiche wie bei
Delphi-Quellcode:
function BuildObject : TObject;
begin
Result := TObject.Create;
end;
var
lObj: TObject;
begin
TObject.Create; // <= MemLeak
BuildObject(); // <= MemLeak;
// keine MemLeaks mit
lObj := TObject.Create;
try
// ...
finally
lObj.Free;
end;
lObj := BuildObject();
try
// ...
finally
lObj.Free;
end;
end;
Es gibt noch einen kleinen Unterschied:
Wenn beim Erzeugen der Instanz ein Problem auftritt, dann soll man auch dafür sorgen, dass die Instanz aufgeräumt wird (so wie das auch der
constructor
macht);
Delphi-Quellcode:
function BuildObject: TObject;
begin
Result := TObject.Create;
// <= Bei einer Excpetion gibt es keine Instanz
try
// hier noch beim Result-Object weitere Eigenschaften setzen
// hier könnte es zu einer Exception kommen
except
Result.Free;
// <= bei einer Exception, wird die Instanz verworfen
raise;
// <= und die Exception wieder ausgelöst
end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)