Aby zwolnić instancję obiektu, należy podać odniesienie do niego, pod którym można zadzwonić pod numer Free()
.
Ponieważ tworzysz instancję obiektu w miejscu jako parametr, jedyne odniesienie, które będziesz mieć, to parametr znajdujący się wewnątrz parametru doSomething()
.
albo trzeba Free
go wewnątrz doSomething()
(co jest praktyką nie radzę robić):
function doSomething(x: TMyObject): Integer;
begin
try
//code
finally
x.Free;
end;
end;
Albo trzeba utworzyć dodatkową zmienną w test()
, przekazać go do doSomething()
, a następnie Free
go po doSomething()
powraca:
procedure test();
var
w: Integer;
o: TMyObject
begin
o := TMyObject.Create;
try
w := doSomething(o);
finally
o.Free;
end;
end;
Choć może się wydawać że za pomocą odniesienia liczone obiektu pozwoli na utworzenie obiektu w miejscu i niech liczenia odniesienia uwolnić obiekt tego rodzaju konstrukcji może nie działać z powodu następującego problemu kompilatora:
The compiler should keep a hidden reference when passing freshly created object instances directly as const interface parameters
Potwierdzają to przez byłego inżyniera Embarcadero kompilatora, Barry Kelly, w odpowiedzi StackOverflow:
Should the compiler hint/warn when passing object instances directly as const interface parameters?
nie bądź leniwy. Utwórz zmienną! – smooty86
tak, zrobiłem to, ale myślę, że jest to możliwe w inny sposób? – Artik
używać interfejsów zamiast obiektów :) – kami